编程语言
首页 > 编程语言> > 有没有办法在GC确定无法访问时回收复杂的java对象

有没有办法在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()); // ??????????????????????????

这真是太棒了:)

解决方法:

您可以使用PhantomReferences来执行此类操作.让一个接口(代理)对象具有对昂贵对象的(强,单向)引用.还要对池管理中昂贵的对象进行强有力的引用.将PhantomReference保留在接口对象上.一旦PhantomReference出现在它的ReferenceQueue上,你肯定知道昂贵的对象没有通过接口对象使用(甚至允许完成).现在可以使用新的接口对象重用昂贵的对象.

但是,它可能不值得.

标签:java,garbage-collection,weak-references,soft-references,phantom-reference
来源: https://codeday.me/bug/20190726/1540446.html