java - 一旦 GC 确定它无法访问,是否有一种方法可以回收复杂的 java 对象

标签 java garbage-collection weak-references soft-references phantom-reference

在 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/

相关文章:

java - 如何知道在cassandra中使用Spark插入的行数

java - 将位置详细信息传递给 mysql 存储过程

java - Proguard : google. gms - 重复的 zip 条目 c.class == zzab.class

java - GC(垃圾收集器)如何标记一个对象进行垃圾收集?

python - 我的方法是否适合垃圾回收循环引用对象?

java - 为 JAXB 转换创建时间戳适配器

haskell - 为什么这里的早期术语不被垃圾收集?

javascript - JavaScript 闭包是如何被垃圾回收的

objective-c - 为什么将正在重新分配的对象设置为弱属性会导致崩溃

c# - 一个类轮 : WeakReference-to-a-Lambda Event Handler