ZGC的介绍

背景

在jdk17中已经将ZGC从实验性产品升级到正式产品功能,达到亚毫秒级停顿,毫不留情地将parallel和G1拉开了数量级的差别,无论是平均停顿还是最大停顿时间都能毫不费劲地控制在10ms内。
《深入理解Java虚拟机》在书中这样定义:ZGC收集器是一款基于Region内存布局的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。

jdk1.8中使用的Parallel Scavenge回收器

介绍

ZGC中取消了分代的设计,并将内存空间按页面的形式来分,ZGC的垃圾回收线程和业务线程同时运行,ZGC是一个高度并发的垃圾回收器,多个线程进行回收,只有短暂的STW同步暂停。
在ZGC中使用了标记-复制算法。
STW: stop the world

在这里插入图片描述

ZGC 周期由三个 STW 暂停和四个并发阶段组成:标记/重新映射( M/R )、并发引用处理( RP )、并发转移准备( EC ) 和并发转移( RE )
ZGC只有三个阶段是STW的,其他阶段完全并发。以往的垃圾回收器在转移时业务线程是不能访问的,在进行复制的时候都是需要STW,ZGC使用到的着色指针(Colored Pointer)和读屏障(Load Barrier)技术,可以让所有线程在并发的条件下就指针的颜色 (状态) 达成一致,而不是对象地址。

着色指针

指针为64位结构,使用4位用来标记位置,四位后面的是用来存地址位,地址位的大小决定了ZGC最大支持多少堆内存。四个颜色位为Finalized ( F )、Remapped ( R )、Marked1 ( M1 ) 和Marked0 ( M0 )。将在gc过程中用到。
如下图,地址位为42,表示最大支持4TB的堆内存。
在这里插入图片描述

读屏障

读屏障解决了并发转移时对象指针更新的问题,(转移期间移动的对象被其他对象所引用,对象被引动了,其他就找不到这个对象了)。
ZGC中通过转发表来将转移前旧的地址映射到新的地址。

执行过程

1、初始标记阶段(STW1):
分配新页给业务线程创建对象。
设置GCRoot的着色指针为M0/M1。M0 M1交替使用。

2、并发标记(M/R):
从GCROOT出发,标记存活对象,并更新页面的活跃度信息(用来后面找转移中间页的)。

3、再标记(STW2)
对可能遗漏的对象再次标记

4、并发转移准备(EC)
选择一个垃圾比较多的页面作为页面转移集

5、初始转移(STW3)
设置转移的视图为remmaped
从GC Roots出发,进行转移。

6、并发转移(RE)
这个阶段会写对象转发表的内容,并且转移,完成旧地址和新地址的映射。

相关推荐

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

    图解ZGC

    2024-04-12 21:34:06      4 阅读
  2. G1与<span style='color:red;'>ZGC</span>

    G1与ZGC

    2024-04-12 21:34:06      42 阅读
  3. JVM调优开启开启ZGC参数

    2024-04-12 21:34:06       34 阅读
  4. GMSSL之ZUC256算法

    2024-04-12 21:34:06       35 阅读
  5. ZCC5429 异步升压芯片

    2024-04-12 21:34:06       21 阅读
  6. ZCC5429 异步升压芯片

    2024-04-12 21:34:06       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-12 21:34:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-12 21:34:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-12 21:34:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-12 21:34:06       20 阅读

热门阅读

  1. XGB-25:Callback函数

    2024-04-12 21:34:06       16 阅读
  2. Linux学习 - 又双叒叕一个软件安装方法

    2024-04-12 21:34:06       17 阅读
  3. vue3获取当前路由为什么一直是 / ?

    2024-04-12 21:34:06       16 阅读
  4. docker命令

    2024-04-12 21:34:06       16 阅读
  5. 单链表的排序,使用冒泡排序【c语言】

    2024-04-12 21:34:06       14 阅读
  6. Docker 入门指南:快速上手 Docker

    2024-04-12 21:34:06       18 阅读
  7. CN3795的学习

    2024-04-12 21:34:06       16 阅读
  8. Mysql 常用关键字总结

    2024-04-12 21:34:06       13 阅读
  9. 【HDFS】 写数据报 NOT_ENOUGH_STORAGE_SPACE

    2024-04-12 21:34:06       14 阅读