我的问题总结了这一切:
- 强可达 Java PhantomReference 能否阻止垃圾收集器 (GC) 回收其引用对象的内存?
详情如下:
Callum 也发布了这个问题,但没有直接回答。那里的一个回复是指Ethan Nicholas的一篇文章,该文章似乎用“否”回答了我的问题,但我不确定这是正确的。
根据我对 Java API 的阅读,我必须用“是”回答我的问题:
- 只要不调用 PhantomReference.clear(),并且 PhantomReference 实例本身仍然被强引用,则永远不会回收引用对象的内存,并且引用对象将保持在幻像可达状态。
为了支持这种理解,我将引用Java Docs:
- “与软引用和弱引用不同,幻像引用在入队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或它们本身变得不可访问。”
例如,假设我创建了一个幻像引用并将该实例保存在 PhantomReference 列表中。然后它的所指对象从强可达下降到幻象可达。
如果您查看 com.google.common.base.internal.Finalizer.java,您将看到以下代码:
private void cleanUp(参考参考)抛出 ShutDown { ... /* * 这是为了虚拟引用的好处。软弱无力 * 此时引用已被清除。 */ 参考.clear(); ... }
我更喜欢有经验的人来回应,而不是进行网络搜索并为我提供链接。谢谢!