对象死亡的两次标记

来源:互联网 发布:新华产权交易所软件 编辑:程序博客网 时间:2024/04/29 08:46
对象的要经历两个标记阶段才会真正的死亡
1.第一次标记
对象没有引用,那么对象会被第一次标记并进行一次筛选,筛选的条件是是否有必要执行finalize方法,如果该对象没有覆盖finalize方法或者finalize方法已经被虚拟机执行过
那么没必要执行
2.第二次标记,
    如果有必要执行finalize 方法,那么对象会被放到一个F-queue的队列中,并在稍后由一个虚拟机建立的低优先级的Finalizer线程去执行,但并保证等待执行结束,这是
    因为,如果一个对象finalize方法执行缓慢或者发生了死循环,就会导致队列中其他对象处于等待状态,finalize方法是对象逃脱的最后一次机会
    
public class FinalizeEscapeGC {      public static FinalizeEscapeGC SAVE_HOOK = null;            public void isAlive(){      System.out.println("yes,i am still alive");      }@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize method executed");FinalizeEscapeGC.SAVE_HOOK = this;}public static void main(String args[]){SAVE_HOOK = new FinalizeEscapeGC();//第一次SAVE_HOOK = null;System.gc();try {Thread.sleep(5000);} catch (InterruptedException e) { e.printStackTrace();}if(SAVE_HOOK !=null){SAVE_HOOK.isAlive();}else{System.out.println("no,i am dead ");}    // 第二次SAVE_HOOK = null;System.gc();try {Thread.sleep(5000);} catch (InterruptedException e) { e.printStackTrace();}if(SAVE_HOOK !=null){SAVE_HOOK.isAlive();}else{System.out.println("no,i am dead ");} } }




两次执行结果不一样是因为,任何一个对象的finalize方法都只会被系统调用一次,第二次不会执行finalize方法。
0 0
原创粉丝点击