美文网首页
一次对象的自我拯救

一次对象的自我拯救

作者: HAPPYers | 来源:发表于2019-07-27 14:19 被阅读0次

分析

要真正回收掉一个对象,至少要经过两次标记过程。具体过程可以见JVM垃圾回收的分析文章。
如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖(重写)finalize()方法或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况视为"没有必要执行"。

下面的代码演示了如何通过覆盖finalize()防止对象自己被第一次垃圾回收。
GC的时候,第一次调用finalize(),又由于在finalize()方法中,将自己的对象引用this传给了静态变量SAVE_HOOK,所以第一次没有被回收。但是finalize()方法只会被调用一次,第二次,当SAVE_HOOK再次NULL的时候,该对象就被回收了。

代码

public class FinalizeEscapeGC {
    public static FinalizeEscapeGC SAVE_HOOK = null;

    public void isAlive() {
        System.out.println("Now, I am alive!");
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Finalize method executed!");
        FinalizeEscapeGC.SAVE_HOOK = this;
    }

    public static void main(String[] args) throws InterruptedException {
        SAVE_HOOK = new FinalizeEscapeGC();
        SAVE_HOOK = null;
        System.gc();
        // finalize方法的优先级很低,此处暂停0.5s来等待它
        Thread.sleep(500);
        if (SAVE_HOOK!=null){
            SAVE_HOOK.isAlive();
        }else{
            System.out.println("Ops, i am dead");
        }
        SAVE_HOOK=null;
        System.gc();
        Thread.sleep(500);
        if (SAVE_HOOK!=null){
            SAVE_HOOK.isAlive();
        }else{
            System.out.println("Ops, i am dead");
        }
    }
}

运行结果

Finalize method executed!
Now, I am alive!
Ops, i am dead

相关文章

  • 一次对象的自我拯救

    分析 要真正回收掉一个对象,至少要经过两次标记过程。具体过程可以见JVM垃圾回收的分析文章。如果对象在进行可达性分...

  • 刚刚想自杀,现在想缓缓

    这是一场自我拯救。人生第一次把“To be or not to be ,it's a question . ”想得...

  • 对象的生死判定和算法详解

    对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一个将死对象?...

  • 学习笔记——积极心理学

    没人来拯救你,请自我拯救(no one is coming to make your life better fo...

  • 拯救成就自我拯救

    《魔法时刻》,以拯救“狼女孩”为线索,细致穿插众多拯救者的情感支流,为读者呈现了一个开头紧张,过程跌宕,结局美好,...

  • 拯救自我

    跳出了人类这一物种内部,站在地球的高度,以亿万年发展的眼光来看待环境问题。人类所做的这一切和这个星球上无数物种一样...

  • 自我拯救

    /小聪 雨天,淋湿了期盼。 见面,来不及说再见。 我把手臂伸开,拥抱孤单。 啤酒,冲刷着情愿; 眼泪,模糊了视线;...

  • 自我拯救

    年少时光,未曾考虑世事,安心在自己的世界里。顽皮的孩子不与之为伍,太老实的孩子更无交集。在属于自己的天...

  • 自我拯救

    今天看危娜老师《刀锋上起舞》,看到“我仔細地看了每一種藥的說明及副作用,然後告訴夢遠,這些藥我不需要繼續吃了。” ...

  • 自我拯救

    自己的世界无需他人的理解、信任、认同、接纳,但是确需要自己认可自己,自己信任自己,自己接纳自己。不评判,不攀附,不...

网友评论

      本文标题:一次对象的自我拯救

      本文链接:https://www.haomeiwen.com/subject/ccisrctx.html