如果对象包含finalize方法,但该对象仍被引用,则garbabe收集器是从堆中移除该对象还是仅清除非托管资源
发布于 2011-03-28 22:12:30
.NET中的GC不会自动清理非托管资源。这就是IDisposable的作用。直到不再需要所有引用时,才会调用finalize。
发布于 2011-03-28 22:13:08
如果对象仍然被引用,GC就没有理由收集它或运行终结器。
此外,GC不清理任何非托管资源。它只是回收你的对象所使用的内存。你必须自己在终结器和IDisposable.Dispose()中清理所有的非托管资源。
发布于 2011-03-28 22:14:06
http://www.csharphelp.com/2006/08/garbage-collection/
关于垃圾收集和finalize的很好的文章。如果你问我,这里的答案太深入了。
每当在堆上分配具有Finalize方法的新对象时,都会将指向该对象的指针放入名为Finalize queue的内部数据结构中。当对象不可达时,垃圾回收器将该对象视为垃圾。垃圾收集器扫描终结队列,查找指向这些对象的指针。当找到一个指针时,该指针将从终结队列中移除,并附加到另一个称为可自由访问队列的内部数据结构中,从而使该对象不再是垃圾的一部分。此时,垃圾收集器已经完成了垃圾的识别。垃圾收集器压缩可回收内存,特殊的运行时线程清空可达队列,执行每个对象的Finalize方法。
下次调用垃圾收集器时,它会看到最终确定的对象是真正的垃圾,然后这些对象的内存就会被释放。
因此,当一个对象需要终结化时,它会死亡,然后存活(复活),最后死亡。建议避免使用Finalize方法,除非required.Finalize方法在两次垃圾回收之前不让该对象使用的内存和资源被释放,从而增加内存压力。由于您无法控制finalize方法的执行顺序,因此可能会导致不可预测的结果。
https://stackoverflow.com/questions/5460221
复制相似问题