在 C++ 中,我使用引用计数对象来实现“自动”回收对象池的 for
SmartPointer<ObjType> object = pool.getObject(); // hold reference
// ... do stuff with object over time.
object = nullptr; // that is when reference
// count goes to 0
-- 现在我在 C++ 对象上有一个“onFinalRelease()”方法,当引用计数达到 0 时调用该方法。我可以覆盖它(默认为 delete(this) )以自动回收对象而不是销毁它们。
问题是我能否使用 java 引用类型和引用池的某种组合来实现此模式。当然,这是一种大型复杂的类型,在有意义的情况下创建对象是昂贵的。那就是我想做的:
SomeReference r = referenceQueue.getReference();
pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????
这真是太好了:)
最佳答案
您可以使用 PhantomReference
我们要做这样的事情。拥有一个接口(interface)(代理)对象,该对象具有对昂贵对象的(强,单向)引用。还要在池管理中保持对昂贵对象的强烈引用。为接口(interface)对象保留一个 PhantomReference
。一旦 PhantomReference
出现在它的 ReferenceQueue
上,您就可以确定昂贵的对象没有通过接口(interface)对象使用(甚至允许完成)。现在可以使用新的接口(interface)对象重用昂贵的对象。
但是,这可能不值得。
关于java - 一旦 GC 确定它无法访问,是否有一种方法可以回收复杂的 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794440/