我想知道这个示例代码会发生什么:
public class Start {
public static void main(String[] args) {
new Start().go();
}
public Start() {
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
}
public boolean running = true;
public void go() {
while( running ) {
try {
Thread.sleep(10);
} catch ( Throwable t ) {}
}
}
}
public class A {
B b;
public void setB(B b) {
this.b = b;
}
}
public class B {
A a;
public void setA(A a) {
this.a = a;
}
}
这显然是一个愚蠢的计划,但是: 我徘徊A和B的实例会发生什么? 它们都是彼此引用的,因此它们不应被视为可收集的。 但实际上,他们对程序的其余部分已经死了,因为它们永远不会被再次引用。
所以我的问题是它们会被垃圾收集吗?或者他们是死记忆?
提前致谢!
答案 0 :(得分:6)
Start
的构造函数结束后,任何“根”都无法访问两个引用a
和b
,因此它们有资格进行垃圾回收。根通常是调用堆栈或全局变量的变量。
一些垃圾收集器(例如那些使用reference counting的垃圾收集器)可能会遇到循环引用问题,但现代GC可以毫无问题地处理这种情况。
答案 1 :(得分:1)
它们被垃圾收集器收集,因为它们不再可用。