3

在 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()); // ??????????????????????????

这将是真正的好:)

4

4 回答 4

7

你可以使用PhantomReferences 来做这样的事情。拥有一个接口(代理)对象,其中包含对昂贵对象的(强、单向)引用。还要在池管理中保持对昂贵对象的强烈引用。保留一个PhantomReference到接口对象。一旦PhantomReference出现,ReferenceQueue您肯定知道昂贵的对象没有通过接口对象使用(甚至允许最终确定)。昂贵的对象现在可以与新的接口对象一起重用。

但是,这可能不值得。

于 2012-01-09T20:16:36.873 回答
1

使用引用计数,当一个对象变成垃圾时,有一个明确定义的时间——当引用计数变为零时。使用 Java 的垃圾收集,不能保证给定对象将被垃圾收集,即使没有更多的强引用

手动实现自己的引用计数器是我能想到的最佳解决方案。

于 2012-01-09T20:13:55.600 回答
0

Java 有类似的东西叫做finalize方法。不幸的是,一旦它为一个对象运行,就没有回头路了。此外,它甚至不能保证运行。

您最好的选择可能是创建一个对象池并跟踪自己是否可以重用它们。Apache Commons Pool可能对此有用。

于 2012-01-09T20:11:48.610 回答
0

这个类可能是你正在寻找的:

https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/SoftReferenceObjectPool.html

于 2015-11-25T09:46:35.173 回答