有没有办法在GC确定无法访问时回收复杂的java对象

pet*_*erk 3 java garbage-collection weak-references phantom-reference soft-references

在C++中,我使用引用计数对象来填充"自动"回收对象池

SmartPointer<ObjType> object = pool.getObject(); // hold reference

// ... do stuff with object over time.

object = nullptr; // that is when reference 
                  // count goes to 0
Run Code Online (Sandbox Code Playgroud)

- 现在我在C++对象上有一个"onFinalRelease()"方法,当refcount达到0时会被调用.我可以覆盖它(默认是delete(this))来自动回收对象而不是销毁它们.

问题是我可以使用java引用类型和引用池的某种组合来实现此模式.当然,这对于一种大型复杂的昂贵而言,在有意义的情况下创建对象.那是我想做的:

SomeReference r = referenceQueue.getReference();

pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????
Run Code Online (Sandbox Code Playgroud)

这真是太棒了:)

Tom*_*ine 7

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

但是,它可能不值得.