关于JAVA的GC,我只是略微了解,我知道如果一个对象没有其他东西引用它,它就会在适当的时机被回收掉。
但,如果一个A对象持有B对象的引用,后对A对象的引用被置为null,那么B对象还会被回收吗?如果B被回收,那么顺序是怎么样的?是A先,还是B先?
就让我们来实践一下:
创建两个类:
public class MyObject {
private MyObject1 myObject1 = new MyObject1();
@Override
protected void finalize() throws Throwable {
System.err.println("my object gc");
}
}
public class MyObject1 {
@Override
protected void finalize() throws Throwable {
System.err.println("my object 1 gc");
}
}
需要说明的是:finalize不一定会在对象被回收前被调用。
Main类:
public class Main {
public static void main(String[] args) {
MyObject myObject =new MyObject();
myObject = null;
System.gc();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
需要说明的是:System.gc()只是建议虚拟机进行垃圾回收,但具体是由虚拟机自己去决定的,这里我使用的是Java HotSpot(TM) 64-Bit Server VM 18.9。
不同的虚拟机实现不同,可能会有不一样的结果。
好的,让我们来执行一下:
my object 1 gc
my object gc
Process finished with exit code 0
首先是object1被回收,然后object才被回收。