3

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

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

那么 unfinalized 和 finalizable 对象之间的正式区别是什么?从引用看来,如果 unfinalized 和 finalizable 要不同,那么对于一个 unfinalized 对象,JVM 最终可能会调用它的终结器是不正确的。有点混乱,或者我还有一些英语语义要研究;)

链接到 Java 规范中的部分:实现终结

4

3 回答 3

5

答案似乎就在这一行:

如果Java虚拟机检测到一个未完成的对象已经变成finalizer-reachable或unreachable,它可能会标记该对象finalizable(G,H);

未最终确定的对象还没有资格进行最终确定。它们是可达的。可终结对象有资格被终结,因此 JVM 可以在选择时这样做。换句话说,“可能”在“允许”的意义上,而不仅仅是“它可能发生”的意义上。

于 2011-06-15T16:14:06.637 回答
2

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

  • 在此状态下,JVM 不会自动调用终结的对象
  • 可终结的对象最终可以让 JVM 自动调用其终结器
于 2011-06-15T16:13:33.977 回答
1

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

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

于 2011-06-15T16:14:30.537 回答