垃圾回收执行流程
1、在对象判定与GC ROOTS没有连接的时候,垃圾开始回收
首先判断对象是否重写了finalize()方法或者已经执行过finalize()方法,如果达到要求直接进行回收操作
2、否则,先将对象放入F-Queue(即将回收)队列当中,由虚拟机自动建立的一个线程finalizer线程进行调度,如果对象在执行finalize()过程中能够将自己引用到GC ROOTS上,将会被重新标记,离开F-Queue,自我拯救成功。
*注意:(1)finalizer线程并不会保证能够等到各个对象的finalize()方法都执行完,原因:如果有的对象的 finalize()方法出现死循环就会出现问题
(2)引用到GC_ROOTS的方法:可以直接将this关键字赋值给类变量或者对象成员变量
测试代码如下:
public class Test_finalizerGC {
private static Test_finalizerGC SAVE_HOOK = null;
public void aLive(){
System.out.println("YES,I AM ALiVE");
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize is execute");
Test_finalizerGC.SAVE_HOOK=this;
}
public static void main(String[] args) throws InterruptedException {
SAVE_HOOK = new Test_finalizerGC();
//置空让其回收
SAVE_HOOK = null;
System.gc();
Thread.sleep(500);
if (SAVE_HOOK !=null){
SAVE_HOOK.aLive();
}else {
System.out.println(" I AM DEAD");
}
//第二次测试
SAVE_HOOK = null;
System.gc();
Thread.sleep(500);
if (SAVE_HOOK !=null){
SAVE_HOOK.aLive();
}else {
System.out.println(" I AM DEAD");
}
}
}
结果: