有没有办法让我知道谁拥有对象的引用?

时间:2009-05-19 13:48:08

标签: c# .net memory-leaks garbage-collection

有没有办法让我知道谁拥有对象的引用?

我看到在调用GC.Collect之后,我的对象没有最终确定。

3 个答案:

答案 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/

他们的网站上也有一些很棒的操作视频。