码迷,mamicode.com
首页 > 其他好文 > 详细

宣告对象死亡过程

时间:2021-02-22 11:46:59      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:stat   protected   main   interrupt   系统调用   内存回收   崩溃   sys   new   

 

第一次标记

  • 在进行可达性分析之后发现没有与GC Roots相连接的引用链

 

筛选

  • 第一次标记后,筛选此对象是否有比要执行finalize()方法

  • 没有必要执行finalize()方法的对象

    • 对象没有覆盖finalize()方法

    • finalize()方法已经被虚拟机调用过

  • 有必要的对象进入F-Queue队列中

    • 由一条虚拟机自动建立的,低调度优先级的Finalizer线程去执行他们的finalize()方法

    • 执行:触发执行,但不等待结束

      如果某个对象的finalize()方法执行缓慢,甚至发生了死循环,将可能导致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的崩溃

 

第二次标记

  • 对F-Queue队列中的对象进行

  • 还没有引用链,回收

对象在筛选过程的自我拯救

public class TestGC {
?
    // 初始化对象为null
    public static TestGC SAVE_HOOK = null;
?
    public void isAlive(){
        System.out.println("对象依然存活...");
    }
?
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize方法执行了...");
        // 把自己赋值给TestGC的SAVE_HOOK变量,引用链的建立
        TestGC.SAVE_HOOK = this;
    }
?
    public static void main(final String[] args) throws InterruptedException {
?
        SAVE_HOOK = new TestGC();
?
        // 对象第一次拯救自己
        // 断掉引用
        SAVE_HOOK = null;
        // 触发垃圾回收
        System.gc();
        // 因为Finalizer方法优先级很低,暂停等待
        Thread.sleep(500);
        // 此时触发finalize方法,引用链再次存在,对象自救成功
        if (SAVE_HOOK != null){
            SAVE_HOOK.isAlive();
        }else {
            System.out.println("对象已经死亡");
        }
?
        SAVE_HOOK = null;
        System.gc();
        Thread.sleep(500);
        // 一个对象的finalize方法最多只会被系统调用一次
        if (SAVE_HOOK != null){
            SAVE_HOOK.isAlive();
        }else {
            System.out.println("对象已经死亡...");
        }
?
    }
}

 

宣告对象死亡过程

标签:stat   protected   main   interrupt   系统调用   内存回收   崩溃   sys   new   

原文地址:https://www.cnblogs.com/LittleSkinny/p/14419976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!