我需要一些关于在C#中追踪内存泄漏原因的建议。我了解什么是内存泄漏,也明白为什么它们会在C#中发生,但我想知道您过去使用过哪些工具/策略来解决它们?
我正在使用.NET Memory Profiler,并发现我的一个巨大的主对象在我关闭它管理的窗口后仍保留在内存中,但我不知道该如何切断与它的所有链接。
如果我表述不够清楚,请发布一个带有问题的回答,我将根据回答编辑我的问题。谢谢!
我需要一些关于在C#中追踪内存泄漏原因的建议。我了解什么是内存泄漏,也明白为什么它们会在C#中发生,但我想知道您过去使用过哪些工具/策略来解决它们?
我正在使用.NET Memory Profiler,并发现我的一个巨大的主对象在我关闭它管理的窗口后仍保留在内存中,但我不知道该如何切断与它的所有链接。
如果我表述不够清楚,请发布一个带有问题的回答,我将根据回答编辑我的问题。谢谢!
进入调试器,然后在立即窗口中输入以下内容:
.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
sos.dll的路径因系统而异。找到正确的路径的方法是在“模块”窗格中查找mscorwks.dll,该dll所在的位置即为sos.dll的正确路径。
然后输入以下内容:
System.GC.Collect()
这将确保收集任何不可达的内容。然后输入:
!DumpHeap -type <some-type-name>
这将向您显示包含地址的所有现有实例的表格。您可以通过以下方式找出是什么使一个实例保持活动状态:
!gcroot <some-address>
我最近发布了一篇 博客文章,讨论了由于特定绑定而引起的某些内存泄漏问题;对于这种特定类型的泄漏,那里的代码可以帮助找到有问题的绑定。