没错,垃圾收集器需要引用可终结对象。当然,在确定对象在最终确定之前是否仍可到达时,不得考虑该特定参考。这意味着需要有关该垃圾收集器引用性质的特殊知识。
当垃圾回收器确定某个对象可以进行终结处理时,终结处理程序将运行,这意味着至少在执行终结处理程序之后,该对象才能再次强烈地可访问。完成对象确定后,必须再次变得无法访问该对象,并且必须对其进行检测,然后才能回收该对象的内存。这就是为什么需要至少两个垃圾回收周期的原因。
在广泛使用的热点/
OpenJDK的环境的情况下(在IBM的JVM也有可能),这是通过创建一个特殊的实例来实现,非公子类
Reference,一
Finalizer,权当一个对象,其类有一个不平凡
finalize()方法,已创建。像弱引用和软引用一样,当不存在对引用的强引用时,垃圾收集器会将这些引用排队,但不会清除它们,因此终结器线程可以读取该对象,使其可以再次强烈地到达终结对象。此时,
Finalizer已清除,但也不再对其进行引用,因此无论如何它都将像普通对象一样被收集,因此到下一次该引用变得不可访问时,不再存在对其的特殊引用。
对于其类具有“琐碎终结器”的对象(即,被
finalize()继承的方法
java.lang.Object或空
finalize()方法),JVM将采取捷径,而不是首先创建
Finalizer实例,因此可以说,这些对象从一开始,大多数对象的行为就好像它们的终结器已经运行一样。



