从javadoc:
与软引用和弱引用不同,幻像引用在排队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身变得不可访问。
一旦放入 ReferenceQueue,幻象链接的引用对象就被认为是“死的”,程序员的代码无法以任何方式访问它。那么为什么 JVM 等待手册clear()
呢?对于弱裁判,它不会。
从javadoc:
与软引用和弱引用不同,幻像引用在排队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身变得不可访问。
一旦放入 ReferenceQueue,幻象链接的引用对象就被认为是“死的”,程序员的代码无法以任何方式访问它。那么为什么 JVM 等待手册clear()
呢?对于弱裁判,它不会。
Holger在回答有关PhantomReference
当队列为 时a 的行为的相关问题时null
,Holger 说:
“这个问题,更难回答的是,为什么 a
PhantomReference
没有被自动清除。文档只说幻影可达对象将保持不变,这是没有被清除的结果,但没有解释为什么这有任何相关性.这个问题已在 SO 上提出,但答案并不令人满意。它说“允许在对象被垃圾收集之前执行清理”,这甚至可能符合做出该设计决策的人的心态,但由于清理代码无法访问对象,因此它是否在之前执行或执行无关紧要对象被回收后。如上所述,由于该规则取决于对象的可达性,而
PhantomReference
对象的可达性受优化代码转换的影响,甚至可能PhantomReference
在清理代码完成之前,对象与实例一起被回收,而没有人注意到。早在 2013 年,我还在HotSpot 开发者邮件列表中发现了一个类似的问题,该问题也没有答案。
有增强请求JDK-8071507来改变这种行为并
PhantomReferences
像其他人一样清除,它对于 Java 9 的状态是“固定的”,事实上,javadocs现在声明它们像任何其他参考一样被清除。”
总之:
但是你这样问你的问题:
那么为什么 JVM 等待手册
clear()
呢?
严格来说,JVM要么等待手动清除,要么等待PhantomReference
自身变得无法访问。(正如霍尔格上面所说。)
因此,它并不像您的问题所暗示的那么糟糕(在 Java 8 及更早版本中)。