Java软参考

时间:2016-05-05 20:20:06

标签: java

假设我有三个对象,A,B和C.

A是指带有软参考的B B是指A的强引用 B也指C有强烈的参考 C也指B有强烈的参考 C也指A有强烈参考。

我们假设没有BC的外部引用。如果我们想象垃圾收集器决定如果可以,它会尝试释放软引用指向的内存,BC将被释放,留下A?或者,从BCA的反向链接以某种方式防止垃圾收集发生,会发生某种循环依赖吗?我的理解是GC应该在抛出OutOfMemory之前收集软引用。

这是一个高度内存密集型应用程序,它模拟了一个非常大的层次结构,因此我希望GC放弃"分支"层次结构只要没有对它们的强引用。我可以在必要时重新生成分支,但这在计算上很昂贵,因此我使用软引用实现了一个缓存。我的一般策略是将软引用指向下游(即指向树的子节点),并将强引用指向指向父节点。

2 个答案:

答案 0 :(得分:3)

我们假设对象A有一个外部强引用。 (即某些" root"对象指向A。)

definition,对象B可以轻松访问,因为没有强引用链到达B,但是有一个由强引用和软引用组成的链到达{ {1}}。因此,B可以根据JVM的判断进行垃圾收集。

同样,对象B不是很容易到达但是可以轻松到达,因此它也可以像C一样进行垃圾收集。

由于从根到达对象的定义,BB形成一个循环的事实没有任何区别。 Java使用完全一般的跟踪垃圾收集(标记和扫描或复制),这对基于refcount的垃圾收集所遭受的参考循环免疫。

enter image description here

答案 1 :(得分:2)

指向树的硬引用不会阻止B和C被收集。