假设我有三个对象,A,B和C.
A
是指带有软参考的B
B
是指A
的强引用
B
也指C
有强烈的参考
C
也指B
有强烈的参考
C
也指A
有强烈参考。
我们假设没有B
或C
的外部引用。如果我们想象垃圾收集器决定如果可以,它会尝试释放软引用指向的内存,B
和C
将被释放,留下A
?或者,从B
和C
到A
的反向链接以某种方式防止垃圾收集发生,会发生某种循环依赖吗?我的理解是GC应该在抛出OutOfMemory之前收集软引用。
这是一个高度内存密集型应用程序,它模拟了一个非常大的层次结构,因此我希望GC放弃"分支"层次结构只要没有对它们的强引用。我可以在必要时重新生成分支,但这在计算上很昂贵,因此我使用软引用实现了一个缓存。我的一般策略是将软引用指向下游(即指向树的子节点),并将强引用指向指向父节点。
答案 0 :(得分:3)
我们假设对象A
有一个外部强引用。 (即某些" root"对象指向A
。)
按definition,对象B
可以轻松访问,因为没有强引用链到达B
,但是有一个由强引用和软引用组成的链到达{ {1}}。因此,B
可以根据JVM的判断进行垃圾收集。
同样,对象B
不是很容易到达但是可以轻松到达,因此它也可以像C
一样进行垃圾收集。
由于从根到达对象的定义,B
和B
形成一个循环的事实没有任何区别。 Java使用完全一般的跟踪垃圾收集(标记和扫描或复制),这对基于refcount的垃圾收集所遭受的参考循环免疫。
答案 1 :(得分:2)
指向树的硬引用不会阻止B和C被收集。