我可以使用一些建议来跟踪C#中内存泄漏的原因.我理解什么是内存泄漏,我知道它们出现在C#中的原因,但我想知道你过去用什么工具/策略来解决它们?
我正在使用.NET Memory Profiler,我发现我关闭它管理的窗口后,我的一个巨大的主要对象是留在内存中,但我不知道如何处理严重的所有链接.
如果我不够清楚只是发一个问题的答案,我会编辑我的问题作为回应.谢谢!
进入调试器,然后在立即窗口中输入:
.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
sos.dll的路径各不相同.找出正确路径的方法是在"模块"窗格中查找mscorwks.dll.从哪里加载是sos.dll的正确路径.
然后键入:
System.GC.Collect()
这将确保收集任何无法到达的内容.然后键入:
!DumpHeap -type
这将显示包含地址的所有现有实例的表.您可以找到保持实例活着的内容,如下所示:
!gcroot
.NET Memory Profiler是一个很好的工具,我经常使用它来诊断WPF应用程序中的内存泄漏.
我确信您知道,使用它的一个好方法是在使用特定功能之前拍摄快照,然后在使用它之后拍摄第二个快照,关闭窗口等.比较两个快照时,您可以看看有多少个特定类型的对象被分配但未被释放:这是一个泄漏.
双击类型后,探查器将显示最短的根路径,使该类型的对象保持活动状态..NET对象在WPF中有许多不同的泄漏方式,因此发布您看到的根路径应该有助于确定最终原因.但是,一般情况下,尝试理解为什么这些对象会抓住您的对象,并查看是否有某种方法可以在窗口关闭时分离事件处理程序,绑定等.
我最近发布了一篇关于特定内存泄漏的博客文章可能是由某些绑定引起的; 对于那些特定类型的泄漏,那里的代码对于找到有错误的Binding非常有用.