jvm-标记阶段的GC算法

一: 引用计数法

  

定义:  每个对象保存一个整形的引用计数器属性,用于记录对象的引用情况.

实现:  对于对象A,只要有任一对象引用了A,计数器就加一,当引用失效,计数器就减一,只要对象A的引用计数器为0,即表示对象A为垃圾对象,既可以回收了.

优点: 实现简单,垃圾对象容易辨识,判定效率高,回收没有延迟性

缺点: 1,需要单独的字段存储计数器,增加了内存开销
        2,每次赋值都需要更新计数器,伴随着加法和减法操作,增加了时间开销
        3,无法处理循环引用:这是最严重的缺陷,直接导致了Java的垃圾收集器中没有使用这种算法

二: 可达性分析算法(根搜索算法,追踪性垃圾收集)

  hostspot虚拟机使用该算法

  是以GCRoots为起始点,内存中存活的对象都会被根对象集合(GCRoots)直接或间接的连接着,称为引用链.

  如果对象没有任何引用链相连,这是不可达的,意味着该对象已死亡,可以标记为垃圾对象.

  再可达性分析算法中,只有被根对象集合的引用链链接的对象,才是存活对象.

  GCRoot组成:

  

jvm中对象的三种状态:

1,可触及的: 从根节点可以到达该对象

2, 可复活的: 对象的所有引用都被释放,但是该对象有可能再finalize()方法中复活

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        instance = this;
    }

3,不可触及的: 对象没有任何被引用,finalize()被调用,并且没有被复活,就会进入不可触及状态.不可触及状态的对象不可能被复活,因为finalize()方法只被调用一次

原文地址:https://www.cnblogs.com/alenblue/p/12922984.html