版权声明:本文为个人学习总结,欢迎转载,转载时请附加原文链接 https://blog.csdn.net/cockroach02/article/details/87390580
一、说明
如果使用【可达性分析算法】中不可达的对象,也并非“非死不可”,这时候他们只是暂时处于“缓刑”阶段,真正判断一个对象死亡需要经历“两次标记过程”,步骤如下:
- 使用可达性分析算法判断A对象不可达;
- 如果A对象覆盖finalize()方法或未者已经执行过finalize则进入3,否则进入5;
- 将A对象放到F-Queue队列中,有虚拟机创建的Finalizer线程去执行;
- 执行A对象的finalize对象,如果在执行过程中对象又建立了引用关联,则从F-Queue队列中去除,否则进入5;
- A对象执行GC
二、示例代码
public class FinalizeEscapeGC {
private static FinalizeEscapeGC instance = null;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize method execute!");
instance = this;
}
public void isAlive() {
System.out.println("yes, i am still alive!");
}
public static void main(String[] args) throws Exception {
instance = new FinalizeEscapeGC();
instance = null;
System.gc();
Thread.sleep(500);
if (instance != null) {
instance.isAlive();
} else {
System.out.println("no, i am dead!");
}
instance = null;
System.gc();
Thread.sleep(500);
if (instance != null) {
instance.isAlive();
} else {
System.out.println("no, i am dead!");
}
}
}
三、执行结果:
finalize method execute!
yes, i am still alive!
no, i am dead!