编程语言
首页 > 编程语言> > Java基础 -> GC如何判断对象可以被回收

Java基础 -> GC如何判断对象可以被回收

作者:互联网

GC如何判断对象可以被回收

对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象,等待垃圾回收。

这里写图片描述

GC Roots的对象有:

堆中的对象在四个地方都没有任何引用时,表示是可以被回收的

被GC判断为”垃圾”的对象一定会回收吗?

堆中的对象在四个地方都没有任何引用时,对象一定会被回收吗?

答:即使在可达性分析算法中不可达的对象,也并非是“非死不可”的。对象拥有一次⾃我拯救的机会。

对象被系统宣告死亡⾄少要经历两次标记过程:

由于finalize()⽅法运⾏代价⾼昂,不确定性⼤,⽆法保证各个对象的调⽤顺序,不推荐⼤家使⽤,建议遗忘它。

public class TestMain {
    public static void main(String[] args) {
        Test test = new Test();
        // 第一次调用垃圾回收
        // 对象为null,第一次标记为可以被回收,但此次调用finalize()不会被真正回收
        test = null;
        System.gc();

        // 第二次调用垃圾回收
        // 对象为null,第二次不能再加入队列也不能再执行finalize()了,被真正回收了
        test = null;
        System.gc();
    }
}

class Test {
    //GC Roots: 来自静态属性
    public static Object object = null;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        //引用静态属性
        object = this;
    }
}

标签:Java,finalize,对象,回收,GC,堆中,Roots
来源: https://blog.csdn.net/rod0320/article/details/123073876