允许死内存的Java垃圾收集?
我想知道这个示例代码会发生什么:允许死内存的Java垃圾收集?,java,garbage-collection,Java,Garbage Collection,我想知道这个示例代码会发生什么: 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 run
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的例子会发生什么?
它们都是相互参照的,因此不应被视为收藏品。
但事实上,它们对程序的其余部分来说是死的,因为它们永远不会被引用
所以我的问题是他们会被垃圾收集吗?或者他们是死的记忆
提前谢谢 一旦
Start
的构造函数结束,任何“根”都无法访问a
和b
这两个引用,因此它们有资格进行垃圾收集。根通常是调用堆栈上的变量或全局变量
一些垃圾收集器(例如使用垃圾收集器的垃圾收集器)在循环引用方面可能会遇到困难,但现代地面军事系统可以毫无问题地处理这种情况。一旦
Start
的构造函数结束,任何“根”都无法访问两个引用a
和b
所以他们有资格进行垃圾收集。根通常是调用堆栈上的变量或全局变量
一些垃圾收集器(例如使用垃圾收集器的垃圾收集器)在循环引用方面可能会遇到困难,但现代地面军事系统可以毫无问题地处理这种情况。垃圾收集器会收集垃圾收集器,因为它们不再可及
它们被垃圾收集器收集,因为它们不再可访问
当
Start
构造函数完成时,a
和b
都不在范围内。当Start
构造函数完成时,a
和b
都不在范围内。@Oak我已澄清。@Oak我已澄清。