ZGC是一个由Azul System公司研发的商用 #分区收集器, 可以使用在 #NUMA 架构上 #STW 时间基本稳定,和堆大小无关 适合TB级别堆

source code

处理流程

  1. 标记启动 超短 #STW 标记 #gcroot 指向的对象
  2. #并发 标记 与G1相同,遍历对象做可达性分析 ZGC的标记实在指针上而不再对象上,将指针更新Marked 0, Marked 1标志位
  3. 标记结束 超短 #STW
  4. #并发 准备 根据查询条件得出本次收集过程要清理哪些区,将这些区组成重分配集合
    每次回收都会查看所有区域
  5. 重分配开始 超短 #STW
  6. #并发 重分配 为重分配集合中的每个区更新维护Forward Table, 记录就对象到新对象的方向关系 若用户线程访问了重分配集合中的对象,该访问会触发 load barrier,并根据所在区上的Forward table讲此次访问重定向到复制好的对象上去,同时修正更新该引用的值,使其指向新对象 这种指针在ZGC中叫做自纠指针
  7. #并发 重映射 修正整个堆中重分配集合里旧对象的所有引用 所有指针都修正完后,原来记录新旧对象关系的Forward table就可以清空了


Published

26 September 2021

Category

development

Tags