考虑以下两类:
public class A { B b; public A(B b) { this.b = b; } } public class B { A a; public B() { this.a = new A(this); } }
如果我有如上所述设计的类,那么此类对象将由垃圾收集器(GC)收集吗?
假设我这样做:
void f() { B b = new B(); }
在此方法中,我创建了一个B名为的实例b,当该方法返回时,b超出了范围,GC应该能够收集它,但是如果要收集它,则必须首先收集a它的成员。属于B并收集的a,它需要b首先收集,这是的成员A。变成圆形。所以我的问题是:这样的循环引用会阻止GC收集对象吗?
B
b
a
A
WeakReference
.Net垃圾收集器可以绝对处理循环引用。在 非常 的垃圾收集器是如何工作的高层次的看法是?
这样就可以很好地收集循环引用。只要从已知无法收集的对象都无法到达它们,则循环引用实质上是无关紧要的。
注意:我意识到我已经省略了许多有趣的细节,以使此答案简单直接