我的问题,总结了这一切:PhantomReference能否通过内存回收来停止其引用?
- 可强可到达的Java幻影从由垃圾收集器(GC)被回收停止其所指对象的内存?
详细情况如下:
Callum posted this question以及但是它不是直截了当地回答。有一个回应指的是Ethan Nicholas的一篇文章,这篇文章似乎用“不”来回答我的问题,但我不确定这是否正确。
根据我的Java API的我会回答我“是”问题阅读:
- 只要PhantomReference.clear()不叫,和幻影实例本身仍然有着强烈的指的是,所指对象的内存将永远不会被回收,并且所指对象将保持在虚幻可达状态。
为了支持这样的认识,我会引用Java Docs:
- “不像软,弱引用,虚引用是,因为他们排队不会自动垃圾收集清理的对象,可以通过幻影访问,直到所有这些引用都被清除或者自己变得无法访问。“
例如,假设我做了一个幻影参考并将该实例保存在PhantomReference的List中。然后它的指称从可达到幻像可达。
如果你看一看com.google.common.base.internal.Finalizer.java,你会看到下面的代码:
private void cleanUp(Reference reference) throws ShutDown { ... /* * This is for the benefit of phantom references. Weak and soft * references will have already been cleared by this point. */ reference.clear(); ... }
我宁愿一个人谁是有经验与主题响应而不是进行网络搜索并提供链接。谢谢!
您是否考虑过简单地测试它?调试器,反射或heapdump可以在GC之后查看引用。或者你可以通过抓住非常大的物体来强制一个OOME。 – the8472