解决内存泄漏问题

时间:2012-08-23 13:38:30

标签: wpf debugging c#-4.0 memory-leaks

我已经阅读了很多关于这个主题的内容,但我仍然没有明确的方法如何继续。任何人都可以指出一些资源(或解释)在详细步骤中显示如何找到未调用某些对象dctor的原因。

基本上我的测试泄漏的逻辑就是这个(WPF应用程序):

  1. 创建一些View / ViewModel
  2. 关闭视图
  3. 调用GC.Collect()
  4. 几秒钟后,通常会调用ViewModel类上的一个dctor,但是从不调用我的应用程序。我想知道当时哪个对象正在引用它,因为在我看来这是找到内存泄漏原因的方法。

    这些类不使用任何非托管资源,也没有实现IDisposable,这意味着没有SupressFinalize调用来阻止析构函数的执行。

    编辑:通过ViewModelLocator上的静态属性检索ViewModel,并添加List。这是TabControl所必需的,它需要收集要绑定的视图模型。 View和ViewModel通过DataTemplate连接。

1 个答案:

答案 0 :(得分:0)

首先,搜索指向您的ViewModel的非取消订阅事件处理程序和静态引用,甚至间接搜索。由于您使用的是WPF应用程序,因此请确保不使用已知会因使用静态引用而导致泄漏的DependencyPropertyDescriptor.AddValueChanged

如果你手动找不到任何东西,请使用真棒(这是我的观点,我与他们没有任何关系)SciTech .NET Memory Profiler。您可以在一个漂亮的图表中查看每个对象所包含的所有引用以及哪些其他对象持有对它的引用 视图。它还会警告您常见的内存问题。

编辑:

  

通过ViewModelLocator

上的Static属性检索ViewModel

不再搜索,你有泄漏。静态引用可防止对象被垃圾回收。删除静态引用或将其包装在WeakReference