• ZGC原理初识


    G1垃圾回收

    STW(stop the world) 是处理耗时的点 在垃圾回收过程中有四处STW分别是:

    1. 初始标记因为只标记GC Roots,耗时较短。
    2. 再标记因为对象数少,耗时也较短。
    3. 清理阶段因为内存分区数量少,耗时也较短。
    4. 转移阶段要处理所有存活的对象,耗时会较长。因此,G1停顿时间的瓶颈主要是标记-复制中的转移阶段STW。为什么转移阶段不能和标记阶段一样并发执行呢?主要是G1未能解决转移过程中准确定位对象地址的问题。

    G1 垃圾回收过程

    复制 --> 复制/初始标记 --> 再标记 --> 清理 --> 复制(混合回收–同时回收老年代与新生代)

    G1 垃圾回收算法

    标记 复制算法

    ZGC原理

    ZGC也采用标记-复制算法,不过ZGC对该算法做了重大改进:ZGC在标记、转移和重定位阶段几乎都是并发的,这是ZGC实现停顿时间小于10ms目标的最关键原因。
    ZGC只有三个STW阶段:初始标记,再标记,初始转移。

    ZGC关键技术

    ZGC通过着色指针和读屏障技术,解决了转移过程中准确访问对象的问题,实现了并发转移。大致原理描述如下:并发转移中“并发”意味着GC线程在转移对象的过程中,应用线程也在不停地访问对象。假设对象发生转移,但对象地址未及时更新,那么应用线程可能访问到旧地址,从而造成错误。而在ZGC中,应用线程访问对象将触发“读屏障”,如果发现对象被移动了,那么“读屏障”会把读出来的指针更新到对象的新地址上,这样应用线程始终访问的都是对象的新地址。那么,JVM是如何判断对象被移动过呢?就是利用对象引用的地址,即着色指针。下面介绍着色指针和读屏障技术细节。

    读屏障

    读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。需要注意的是,仅“从堆中读取对象引用”才会触发这段代码。

    Object o = obj.FieldA   // 从堆中读取引用,需要加入屏障
    <Load barrier>
    Object p = o  // 无需加入屏障,因为不是从堆中读取引用
    o.dosomething() // 无需加入屏障,因为不是从堆中读取引用
    int i =  obj.FieldB  //无需加入屏障,因为不是对象引用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考文献:
    https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html

  • 相关阅读:
    llamaindex原理与应用简介(宏观理解)
    为啥大家都在用 Docker !!
    73个产品小白必备知识,项目管理也可看
    Python之哈希表-字典
    鸿蒙Next怎么升级,有便捷的方法?
    基于Java+SpringBoot+Vue前后端分离游戏交易系统设计和实现
    视频录制后怎么裁剪?这里有可以学习的操作
    Java书签 #获取项目应用中所有Mapper接口并打印URL
    微服务技术栈-Gateway服务网关
    UI设计公司成长日记2:修身及持之以恒不断学习是要务
  • 原文地址:https://blog.csdn.net/u010430099/article/details/133300682