my workmate told me such a senario, there're two objects, which are instantiated in a local method, respectively assigned to local variables. A class has a type B field, B class has a type A field, and their instances, each has other's instance, the following program illustrates:
class A {
B b;
public A() {
System.out.println("constructing a");
}
public void finalize() {
System.out.println("finalize a");
}
}
class B {
A a;
public B() {
System.out.println("constructing b");
}
public void finalize() {
System.out.println("finalize b");
}
}
public class Test {
public static void main(String[] args) {
new Test().go();
}
public void go() {
A a = new A();
B b = new B();
a.b = b;
b.a = a;
try {
a = null;
b = null;
System.gc();
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void finalize() {
System.out.println("finalize Test");
}
}
guess what? as we may reasonably guess: even if the method finishes, each instance has been referenced by the other one at least, so they wouldn't be garbage collected, right? but the actual result is:
constructing a
constructing b
finalize b
finalize a
they are both garbage collected even if they may still be referenced. WHY ?
primary conclusion may be they two as a whole has been treated a one object which's no longer be referenced, so they get garbage collected.