如果假设一个对象实现了Finalize方法,但它内部引用了一个应用程序的活动静态对象(设计不好!但非常可能)。
现在当GC通过将对象置于Finalization队列中并最终确定对象并将其移动到FReachable队列时,它将调用其finalize方法。
但是哇!它发现它引用了一个活着的对象,所以它不允许GC回收对象占用的内存并再次标记该对象。一个僵尸对象!
此时此对象所在的位置?
对于这样的对象,ReRegisterForFinalize()的最佳位置是什么?
答案 0 :(得分:1)
它发现它引用了一个活着的对象
那没关系。传出引用与GC无关。
另一种情况是终结对象通过将自身注册到某个有根列表中,使自己再次可以访问。
这称为复活。它不需要GC特别注意:处理终结器并从fReachable中删除引用。请注意,没有什么特别的,fReachable中的对象在任何时候都处于不确定状态 。它们必须在下一个GC集合中重新扫描。终结者的成本之一是需要2轮GC。
通常情况下,物体在复活时会调用ReRegisterForFinalize(this)
但请注意,复活远非常见的做法。