ZGC的流程图

GC标记过程


1、初始标记

扫描所有线程栈的根节点,然后再扫描根节点直接引用的对象并进行标记。这个阶段需要停顿所有的应用线程(STW),但由于只扫描根对象直接引用的对象,所以停顿时间很短。停顿时间高度依赖根节点的数量,从JDK16开始,已经解决了此问题: https://malloc.se/blog/zgc-jdk16

2、并发标记/并发对象重定位

第1个GC周期:并发遍历上一次标记下引用的对象并标记。

第2个GC周期:并发遍历的过程中,顺便把上周期"并发迁移"阶段迁移的对象指针修正指向到新分区。

3、标记结束/再标记

标记上一次标记过程新产生的对象。并发标记过程中,应用线程可能会产生一些新对象,所以需要再标记出来。这个阶段需要停顿所有的应用线程。(STW),但由于只标记新增的对象,数量很少,所以停顿时间很短。

4、并发转移准备

为对象转移做一些前置准备,比如引用处理、弱引用清理和重定位集选择等。

5、转移开始/初始转移

迁移根节点直接引用的对象到新分区,这个阶段需要停顿所有的应用线程(STW),但由于只迁移根节点直接引用的对象,所以停顿时间很短。

6、并发迁移

并发迁移“并发标记”阶段标记的对象到新分区(对象引用指针未修改,仍指向旧分区)。

4.5、几个问题说明
1、为何并发转移阶段,对象已转移至新分区后,却没有修改线程栈上实际的引用,依然指向旧分区?

因为如果此时再扫描线程栈,修改引用地址,要扫描的量太大,效率太低。

刚好下一个GC周期也要进行扫描标记,可以利用扫描标记的时间,同时把对象引用修正指向到新分区,以此提升效率,减少停顿时间

2、并发转移阶段对象已迁移,但引用指针仍指向旧分区,如何保证旧分区被清理后对象仍然可以访问?

•由于未修改对象引用指针,为防止旧分区被清理,导致对象找不到的问题,此处引入了读屏障和转发表

•转发表记录了对象从旧位置到新位置的映射关系,实现类似一个hash表,key是旧分区的位置,value是新分区的位置,此时当访问旧位置的对象时,通过转发表可以获取新位置。这样可以避免在整个堆空间中更新对象引用的开销,因为只需要更新转发表中的条目即可。

•读屏障的作用是在读取对象引用时,检查对象的标记状态并获取转发表中的映射关系。通过读屏障,ZGC能够在读取对象引用时,将访问重定向到新位置,以确保对象的访问仍然有效。如下图:每次读取引用时会触发一次读屏障

5、GC全流程示意图
此示意图依据JDK11的ZGC理念绘制,尽管在JDK11至JDK17的多个版本迭代过程中,部分技术实现或许发生了变动,然而核心原理依旧保持不变。

GC整个标记流程图如下:


你还在“垃圾”调优?快来看看JDK17的ZGC如何解放双手 | 京东云技术团队
https://blog.51cto.com/u_15714439/9177812

相关推荐

  1. 图解<span style='color:red;'>ZGC</span>

    图解ZGC

    2024-07-13 06:28:02      29 阅读
  2. G1与<span style='color:red;'>ZGC</span>

    G1与ZGC

    2024-07-13 06:28:02      61 阅读
  3. JVM调优开启开启ZGC参数

    2024-07-13 06:28:02       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 06:28:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 06:28:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 06:28:02       57 阅读
  4. Python语言-面向对象

    2024-07-13 06:28:02       68 阅读

热门阅读

  1. 三级_网络技术_14_局域网技术基础及应用

    2024-07-13 06:28:02       24 阅读
  2. TCP网络传输控制协议

    2024-07-13 06:28:02       23 阅读
  3. 医疗健康信息的安全挑战与隐私保护最佳实践

    2024-07-13 06:28:02       27 阅读
  4. SqlServer数据库常见问题

    2024-07-13 06:28:02       26 阅读
  5. debian KVM安装虚拟机

    2024-07-13 06:28:02       21 阅读
  6. 【深度学习】本地运行 GraphRAG + Ollama

    2024-07-13 06:28:02       25 阅读
  7. vim编辑器

    2024-07-13 06:28:02       22 阅读
  8. Linux 安装elk

    2024-07-13 06:28:02       21 阅读
  9. read paper and make summer (Image enhancement)

    2024-07-13 06:28:02       21 阅读
  10. 深入理解 Vuex:Vue.js 的状态管理模式

    2024-07-13 06:28:02       16 阅读