垃圾收集

时间:2011-03-28 14:10:35

标签: c# garbage-collection

如果一个对象包含finalize方法,但仍然引用了该对象,那么garbabe收集器是否会从堆中删除该对象,或者只是清除非托管资源

4 个答案:

答案 0 :(得分:4)

.NET中的GC不会自动清理非托管资源。这就是IDisposable的用途。在不再需要所有引用之前,不会调用finalize

答案 1 :(得分:0)

如果仍然引用该对象,则GC没有理由收集它或运行终结器。

此外,GC不会清除任何非托管资源。它只是回收对象使用的内存。您必须在终结器中自行清理所有非托管资源,并且优先IDisposable.Dispose()

答案 2 :(得分:0)

http://www.csharphelp.com/2006/08/garbage-collection/

关于垃圾收集的最佳文章并最终确定。如果你问我,这里的答案也很全面。

  

每当一个新对象,有一个   Finalize方法,就是在上面分配的   堆放指向该对象的指针   inan内部数据结构称为   终结队列。当一个物体是   无法访问,垃圾收集器   认为对象是垃圾。该   垃圾收集器扫描   终结队列正在寻找   指向这些对象的指针。当一个   找到指针,指针是   从终结队列中删除   并附加到另一个内部数据   结构称为Freachable queue,   使对象不再是其中的一部分   垃圾。此时,   垃圾收集器已经完成   识别垃圾。垃圾   收集器压缩可回收   内存和特殊运行时线程   清空可达队列,   执行每个对象的Finalize   方法。

     

下次是垃圾收集器   调用,它看到最终确定   对象真的是垃圾和垃圾   那么这些对象的内存是,   简单地解放了。

     

因此当一个物体需要时   终结,它死了,然后生活   (复活)并最终再次死亡。它   建议避免使用Finalize   方法,除非必要。最终   方法增加记忆压力   不要让记忆和   该对象使用的资源   释放,直到两个垃圾   集合。既然你没有   控制顺序   可以执行finalize方法   导致无法预测的结果。

答案 3 :(得分:0)

当对象是Garbage Collected时,将调用

Finalize简单地说(虽然有很多例外),如果对某个对象的所有引用都超出了范围,那么当GC唤醒时(大量的条件可以触发它,但通常是内存阈值)它将调用finalize,然后回收托管内存。

因此,如果您的对象仍然具有范围内的引用,则将被垃圾收集(同样存在方案和例外)。

GC不关心非托管,但是您需要通过实施Dispose来实现IDisposible模式。