一、说明
如果使用【可达性分析算法】中不可达的对象,也并非“非死不可”,这时候他们只是暂时处于“缓刑”阶段,真正判断一个对象死亡需要经历“两次标记过程”,步骤如下:
- 使用可达性分析算法判断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 {