0

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

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

  1. 创建一些视图/视图模型
  2. 关闭视图
  3. 调用 GC.Collect()

几秒钟后,通常会调用 ViewModel 类的 dctor,但在我的应用程序上从未调用过。我想知道当时哪个对象持有对它的引用,因为我认为这是找到内存泄漏原因的方法。

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

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

4

1 回答 1

0

首先,搜索未订阅的事件处理程序和指向您的 ViewModel 的静态引用,即使是间接的。由于您在 WPF 应用程序中,因此还要确保您不使用DependencyPropertyDescriptor.AddValueChanged已知会导致泄漏的静态引用。

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

编辑:

ViewModel 是通过 ViewModelLocator 上的静态属性检索的

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

于 2012-08-23T13:53:36.707 回答