Java 定义:未终结对象与可终结对象

Java 定义:未终结对象与可终结对象,java,garbage-collection,specifications,finalization,Java,Garbage Collection,Specifications,Finalization,为了理解Java中的弱引用,我不得不参考Java语言规范。第12.6节中的以下部分让我感到困惑: 未完成的对象从未自动调用其终结器; 已完成的对象已自动调用其终结器。最后定稿 对象从未自动调用其终结器,但Java虚拟 机器最终可能会自动调用其终结器 那么,未终结对象和可终结对象之间的形式区别是什么呢?从引文中可以看出,如果unfinalized和finalizable是不同的,那么对于一个unfinalized对象,JVM可能最终调用它的finalizer是不正确的。有点困惑,或者我还有一些英语

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

未完成的对象从未自动调用其终结器; 已完成的对象已自动调用其终结器。最后定稿 对象从未自动调用其终结器,但Java虚拟 机器最终可能会自动调用其终结器

那么,未终结对象和可终结对象之间的形式区别是什么呢?从引文中可以看出,如果unfinalized和finalizable是不同的,那么对于一个unfinalized对象,JVM可能最终调用它的finalizer是不正确的。有点困惑,或者我还有一些英语语义学要学;)


链接到Java规范中的部分:

未终结对象和可终结对象之间的区别在于,第二个上的终结器可以在将来的任何时候自动调用,而未终结对象上的终结器不能自动调用,除非对象首先成为可终结的

  • 在这种状态下,未完成的对象将不会得到JVM自动调用的终结器
  • 一个可终结的对象最终可以得到JVM自动调用的终结器

    • 答案似乎就在这一行:

      如果Java虚拟机检测到未完成的对象已成为终结器可访问或不可访问的对象,它可能会将该对象标记为可终结(G,H)


      未完成的对象尚不符合终结条件。它们是可以到达的。可终结的对象有资格被终结,因此JVM可以在它选择的时候这样做。换言之,“可能”的意思是“有权限”,而不仅仅是“它可能会发生。”

      不保证会执行GC或调用
      finalize()
      。这很可能在某个时候发生

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

      您的意思是“…如果仍然没有对其进行强引用。”而不是“字符串引用…”