【问题标题】:Solving the memory leak issues解决内存泄漏问题
【发布时间】:2012-08-19 01:05:36
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 在不知道您如何使用 viewModel 的情况下很难回答这个问题
  • 抱歉,我认为检测内存泄漏的方法在大多数情况下都是相同的。我正在添加有关如何使用 VM 的信息
  • 附带说明,如果你的类没有使用非托管资源,你真的不应该为它们实现终结器;最终确定时对象的状态是这样的,您不应该假设您可以访问以前在该类活动时有效的任何托管引用。终结器仅用于非托管清理(然后实际上仅作为适当确定性处置的备份。)
  • 嗨,丹,我不认为这只是用于测试的调试信息。

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


【解决方案1】:

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

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

编辑:

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

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

【讨论】:

  • 嗨 Julien,我已更正 ViewModelLocator 以使用单例模式,因此不再有静态属性。当我们谈到非未订阅事件处理程序时,我在我的应用程序中使用了很多匿名方法。例如,对于每个 RelayCommand(MVVM 轻框架)我都使用匿名方法,所以没有退订。这会造成内存泄漏吗?我问这个是因为使用 .NET 内存分析器我得到了很多类型间接委托根的报告,并且我看到在某些入口中报告了 ICommands。
猜你喜欢
  • 2010-12-11
  • 2012-05-23
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多