新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第4章 ZGC 垃圾回收算法设计

4.1 并发垃圾回收

    4.1.1 并发垃圾回收概述

          标记:从根集合出发,标记活跃对象;

          转移 : 活跃对象转移到新内存,原来的内存就可以回收

          重定位 :对象内存地址变化,所有指向对象老地址的指针就要调整到对象新地址上

   4.1.2 ZGC 并发算法

           1.初始标记,再次标记,初始转移(转移根对象引用的对象) 是STW,其余的都是和mutator应用线程并发

            2.转移完成后,页面空间充足,就下一次垃圾回收周期再回收。如果不充足,就立即回收

  4.2 并发处理

        三色标记法:

           1.白色: 还没有被回收器标记的对象

扫描二维码关注公众号,回复: 9799878 查看本文章

           2.灰色 : 自身已经被标记到,但其拥有的成员变量引用到别的对象还没有处理

           3.黑色 : 已经被标记的对象

 对象漏标解决方法

    1. 把被更新的黑色或者白色对象 标记成灰色

    2.SATB 关注的引用的删除,对象赋值前,老的引用对象记录下来,然后根据这些对象重新标记一遍。也就是对象3标记成为灰色

ZGC并发标记和并发转移采用的是第二种方法,访问到的数据都作为活跃对象标记或者转移。

4.2.2 ZGC 并发处理算法

         ZGC初始化后,计入标记阶段的视图转变为Marked0,也就是M0。或者Marked1,也就是M1

   如果发现对象的地址视图是M0,说明对象是进入标记阶段之后,新分配的对象或者对象已经完成了标记。代表对象是活跃的,无需处理。如果标记阶段结束后,对象的地址视图是Remapped,白色,说明不能被根集合访问到,没有应用程序访问,这个对象所使用的内存就可以被回收。

  3. 并发转移阶段 :此时地址视图再次被设置为Remapped,转移阶段会把活跃对象转移到新的内存中,并回收对象转移前的内存空间。 转移阶段,应用程序和标记线程并发执行

  对象是活跃的,并且对象地址视图为M0,则转移对象,转移以后对象的地址视图,从M0调整为Remapped

  M1: 本次垃圾回收中识别的活跃对象

  M0: 前一次垃圾回收标记阶段被标记过的活跃对象,对象在转移阶段未被转移,但是本次垃圾回收中被识别为不活跃对象。

  Remapped : 前一次垃圾回收的转移阶段发生转移的对象,或者被应用程序访问的对象。但是本次垃圾回收被设别为不活跃对象。

发布了365 篇原创文章 · 获赞 2 · 访问量 7441

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/104101410
ZGC