有没有办法知道什么让对象在C#中保持活着?

时间:2010-08-07 23:02:33

标签: c# pointers reference garbage-collection

我正在尝试优化程序的内存使用,因此希望在不再需要它们时删除它们。为了检查这是否正常,我在析构函数中编写了一个console.writeline方法,用于我想要删除的对象类型。但是,当我测试程序时,没有写入任何行(仅当程序终止时)。

有没有办法获取对象,事件,...的列表。这使得某个对象保持活着并防止它被垃圾收集器消除。或者是否有一个分析器,调试器可以执行此操作(如果可能,MonoDevelop兼容)?

4 个答案:

答案 0 :(得分:4)

清理发生由系统控制,如果你的内存分配足够小并且系统认为没有必要清理,那么你的析构函数就不会被调用。 它不是生产的最佳实践,但您可以通过GC强制GC .Collect()仅在测试时使用它。如果您的析构函数未被调用,则可能存在泄漏。

我不知道单声道环境中的探查器,但this profiler在Windows中已经足够了。

答案 1 :(得分:4)

WinDbg + SOS可以帮助理解这一点。但要了解这一点需要时间。例如,

Where's your leak at? [Using WinDbg, SOS, and GCRoot to diagnose a .NET memory leak]

答案 2 :(得分:3)

.NET垃圾收集器将自动清理(免费)未被引用的对象。但是,程序使用静态字段,未删除的事件处理程序或其他引用使对象保持活动(并使用内存)的时间超过严格必要的时间并不罕见。

要解决此问题,请使用内存分析器来识别包含对象的“根”,找出它们仍被引用的原因,并修复导致仍然引用该对象的错误。

一些商业和免费的内存分析器是:

答案 3 :(得分:2)

取消分配资源需要资源。如果垃圾收集器未检测到正在使用太多内存,则不会释放其资源。如果您需要确定性的“析构函数”,请实现IDisposable。另请参阅 "using" keyword