有没有办法在GC确定无法访问时回收复杂的java对象
作者:互联网
在C中,我使用引用计数对象来填充“自动”回收对象池
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()”方法,当refcount达到0时调用它.我可以覆盖它(默认是delete(this))来自动回收对象而不是销毁它们.
问题是我可以使用java引用类型和引用池的某种组合来实现此模式.当然,这对于一种大型复杂的昂贵而言,在有意义的情况下创建对象.那是我想做的:
SomeReference r = referenceQueue.getReference();
pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????
这真是太棒了:)
解决方法:
您可以使用PhantomReference
s来执行此类操作.让一个接口(代理)对象具有对昂贵对象的(强,单向)引用.还要对池管理中昂贵的对象进行强有力的引用.将PhantomReference保留在接口对象上.一旦PhantomReference出现在它的ReferenceQueue上,你肯定知道昂贵的对象没有通过接口对象使用(甚至允许完成).现在可以使用新的接口对象重用昂贵的对象.
但是,它可能不值得.
标签:java,garbage-collection,weak-references,soft-references,phantom-reference 来源: https://codeday.me/bug/20190726/1540446.html