2

javadoc

与软引用和弱引用不同,幻像引用在排队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身变得不可访问。

一旦放入 ReferenceQueue,幻象链接的引用对象就被认为是“死的”,程序员的代码无法以任何方式访问它。那么为什么 JVM 等待手册clear()呢?对于弱裁判,它不会。

4

1 回答 1

2

Holger在回答有关PhantomReference当队列为 时a 的行为的相关问题时null,Holger 说:

“这个问题,更难回答的是,为什么 aPhantomReference没有被自动清除。文档只说幻影可达对象将保持不变,这是没有被清除的结果,但没有解释为什么这有任何相关性.

这个问题已在 SO 上提出,但答案并不令人满意。它说“允许在对象被垃圾收集之前执行清理”,这甚至可能符合做出该设计决策的人的心态,但由于清理代码无法访问对象,因此它是否在之前执行或执行无关紧要对象被回收后。如上所述,由于该规则取决于对象的可达性,而PhantomReference对象的可达性受优化代码转换的影响,甚至可能PhantomReference在清理代码完成之前,对象与实例一起被回收,而没有人注意到。

早在 2013 年,我还在HotSpot 开发者邮件列表中发现了一个类似的问题,该问题也没有答案。

有增强请求JDK-8071507来改变这种行为并PhantomReferences像其他人一样清除,它对于 Java 9 的状态是“固定的”,事实上,javadocs现在声明它们像任何其他参考一样被清除。”


总之:

  • 最初的设计决定不清除参考是有问题的。
  • 从 Java 9 开始,行为发生了变化。

但是你这样问你的问题:

那么为什么 JVM 等待手册clear()呢?

严格来说,JVM要么等待手动清除,要么等待PhantomReference自身变得无法访问。(正如霍尔格上面所说。)

因此,它并不像您的问题所暗示的那么糟糕(在 Java 8 及更早版本中)。

于 2019-08-10T11:24:03.140 回答