如果发现FReachable Objects可以访问它们会发生什么?

时间:2011-07-09 11:40:42

标签: .net garbage-collection finalization

如果假设一个对象实现了Finalize方法,但它内部引用了一个应用程序的活动静态对象(设计不好!但非常可能)。

现在当GC通过将对象置于Finalization队列中并最终确定对象并将其移动到FReachable队列时,它将调用其finalize方法。

但是哇!它发现它引用了一个活着的对象,所以它不允许GC回收对象占用的内存并再次标记该对象。一个僵尸对象!

此时此对象所在的位置?

  1. 仍然是可以自由的?
  2. 保留在终结队列中?
  3. 在不确定状态下保留在托管堆上(从可释放和终结队列中删除)?
  4. 对于这样的对象,ReRegisterForFinalize()的最佳位置是什么?

1 个答案:

答案 0 :(得分:1)

  

它发现它引用了一个活着的对象

那没关系。传出引用与GC无关。

另一种情况是终结对象通过将自身注册到某个有根列表中,使自己再次可以访问。

这称为复活。它不需要GC特别注意:处理终结器并从fReachable中删除引用。请注意,没有什么特别的,fReachable中的对象在任何时候都处于不确定状态 。它们必须在下一个GC集合中重新扫描。终结者的成本之一是需要2轮GC。

通常情况下,物体在复活时会调用ReRegisterForFinalize(this) 但请注意,复活远非常见的做法。