为了理解Java中的弱引用,我不得不参考Java语言规范。以下部分来自第12.6节,让我感到困惑:
未终结的对象从未调用过终结器; 最终对象已自动调用其终结器。可以最终确定 对象从来没有自动调用它的终结器,而是Java虚拟 机器最终可能会自动调用其终结器。
那么,未定型和可终结的对象之间的形式差异是什么?从引用看来,如果不完全和最终化是不同的,那么对于一个未完成的对象,它必须是不为真,JVM最终可以调用它的终结器。有点困惑,或者我仍然有一些英语语义学习;)
链接到Java规范中的部分:Implementing Finalization
答案 0 :(得分:4)
答案似乎在于这一行:
如果Java虚拟机检测到未终结对象已成为终结器可访问或无法访问,则可以将对象标记为可终结(G,H);
未定型的对象尚不符合最终确定的条件。他们是可以到达的。可终结的对象有资格完成,因此JVM可以在选择时执行此操作。换句话说,“可能”在“有权允许”的意义上,而不仅仅是“它可能会发生”。
答案 1 :(得分:2)
未终结对象和可终结对象之间的区别在于,第二个上的终结器可以在将来的任何时间自动调用,而未终结对象上的终结器可以' t 会被自动调用,除非该对象首先可以最终化。
答案 2 :(得分:1)
无法保证将执行GC或将会调用finalize()
。它很可能会在某个时刻发生。
当一个对象不再具有强引用时,它可以被垃圾收集。一段时间后,可以执行GC并将对象添加到终结队列以调用其finalize()
方法。调用该方法后,如果仍然没有强引用,则可以将其删除。