有没有办法让我知道谁拥有对象的引用?
我看到在调用GC.Collect之后,我的对象没有最终确定。
答案 0 :(得分:4)
在代码中无法有效地执行此操作。追踪此类泄漏的最佳方法是使用WinDbg之类的工具。 SOS扩展有几个命令,专门用于帮助跟踪内存泄漏。
Rico在这个主题上做了一个完整的博客文章:
答案 1 :(得分:2)
您应该在GC.Collect
之后调用GC.WaitForPendingFinalizers
以允许垃圾收集器清除可释放队列。由于GC在不同的线程中运行,因此当GC尝试完成任何需要完成的对象时,您的应用程序可能已继续运行。通过调用GC.WaitForPendingFinalizers
,您强制当前线程等待GC完成清除可释放队列(需要完成的项目队列),然后再继续执行。
尽管如此,我同意Joel Coehoorn的评论 - 当你不管它时,GC的效果最好。
答案 2 :(得分:2)
除了Windbg,您还可以使用.net探查器。我已经完成了两种方式 - 配置文件不会告诉你Windbg不能做的任何事情,但是一个好的分析器会更友好。
WinDBG的 除了来自JaredPar的链接之外,Tess Ferrandez还有一些关于在.net上使用Windbg的精彩文章。这是一篇内存泄漏文章:http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx
探查: 我和SciTech的探测器一起运气很好(我没有任何关联,但是很棒的工具): http://memprofiler.com/
他们的网站上也有一些很棒的操作视频。