定义:未定型对象与最终对象

时间:2011-06-15 16:02:21

标签: java garbage-collection specifications finalization

为了理解Java中的弱引用,我不得不参考Java语言规范。以下部分来自第12.6节,让我感到困惑:

  

未终结的对象从未调用过终结器;       最终对象已自动调用其终结器。可以最终确定       对象从来没有自动调用它的终结器,而是Java虚拟       机器最终可能会自动调用其终结器。

那么,未定型和可终结的对象之间的形式差异是什么?从引用看来,如果不完全和最终化是不同的,那么对于一个未完成的对象,它必须是为真,JVM最终可以调用它的终结器。有点困惑,或者我仍然有一些英语语义学习;)

链接到Java规范中的部分:Implementing Finalization

3 个答案:

答案 0 :(得分:4)

答案似乎在于这一行:

  

如果Java虚拟机检测到未终结对象已成为终结器可访问或无法访问,则可以将对象标记为可终结(G,H);

未定型的对象尚不符合最终确定的条件。他们是可以到达的。可终结的对象有资格完成,因此JVM可以在选择时执行此操作。换句话说,“可能”在“有权允许”的意义上,而不仅仅是“它可能会发生”。

答案 1 :(得分:2)

未终结对象和可终结对象之间的区别在于,第二个上的终结器可以在将来的任何时间自动调用,而未终结对象上的终结器可以' t 会被自动调用,除非该对象首先可以最终化。

  • 未完成对象 将在此状态下由JVM自动调用其终结器
  • 可终结的对象最终可以获取JVM自动调用的终结器

答案 2 :(得分:1)

无法保证将执行GC或将会调用finalize()。它很可能会在某个时刻发生。

当一个对象不再具有强引用时,它可以被垃圾收集。一段时间后,可以执行GC并将对象添加到终结队列以调用其finalize()方法。调用该方法后,如果仍然没有强引用,则可以将其删除。