C#WPF中的内存泄漏

C#WPF中的内存泄漏,c#,memory-leaks,garbage-collection,profiling,C#,Memory Leaks,Garbage Collection,Profiling,我可以用一些建议来追踪C#中内存泄漏的原因。我知道什么是内存泄漏,我知道为什么它们会发生在C#中,但我想知道您过去使用了哪些工具/策略来解决它们 我正在使用.NET内存探查器,我发现在关闭它管理的窗口后,我的一个大型主要对象仍保留在内存中,但我不确定如何处理所有指向它的链接 如果我不够清楚,只需发布一个带有问题的答案,我会编辑我的问题作为回应。谢谢 进入调试器,然后在即时窗口中键入: .load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.

我可以用一些建议来追踪C#中内存泄漏的原因。我知道什么是内存泄漏,我知道为什么它们会发生在C#中,但我想知道您过去使用了哪些工具/策略来解决它们

我正在使用.NET内存探查器,我发现在关闭它管理的窗口后,我的一个大型主要对象仍保留在内存中,但我不确定如何处理所有指向它的链接


如果我不够清楚,只需发布一个带有问题的答案,我会编辑我的问题作为回应。谢谢

进入调试器,然后在即时窗口中键入:

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
sos.dll的路径各不相同。找到正确路径的方法是在模块窗格中查找mscorwks.dll。无论从何处加载,都是sos.dll的正确路径

然后键入以下内容:

System.GC.Collect()
!DumpHeap -type <some-type-name>
这将确保收集任何无法访问的内容。然后键入以下内容:

System.GC.Collect()
!DumpHeap -type <some-type-name>
!转储堆类型
这将显示一个包含所有现有实例和地址的表。您可以像下面这样找出保持实例活动的原因:

!gcroot <some-address>
!根

.NET内存探查器是一个很好的工具,我经常使用它来诊断WPF应用程序中的内存泄漏

我相信您知道,使用它的一个好方法是在使用特定功能之前拍摄快照,然后在使用后拍摄第二个快照,关闭窗口等。在比较两个快照时,您可以看到有多少特定类型的对象正在被分配但未被释放:这是一个泄漏

双击某个类型后,探查器将显示使该类型的对象保持活动状态的最短根路径。.NET对象在WPF中泄漏的方式有很多种,因此发布您看到的根路径应该有助于确定最终原因。但是,一般来说,请尝试理解为什么这些对象会保留在您的对象上,并查看是否有某种方法可以在关闭窗口时分离事件处理程序、绑定等


我最近发布了一篇关于特定绑定可能导致的特定事件的文章;对于特定类型的泄漏,那里的代码对于查找出错的绑定非常有用

还可以尝试使用Ants内存探查器,因为它将显示指向给定对象的witch对象。我必须使用System.GC.Collect()才能使垃圾收集正常工作。我认为这可能取决于您闯入调试器时调试器停止的位置。我会修正我的答案,让它不管怎样都有效。