一文读懂ZGC

ZGC是低延迟、大内存支持的并发垃圾回收器,对比G1,其停顿时间更短。ZGC采用染色指针和内存多重映射技术,减少STW时间。文章详细介绍了ZGC的工作原理、内存布局、垃圾回收阶段以及调优建议。虽然分配速率低且需要较高版本JDK,但适合对延迟敏感的应用。
摘要由CSDN通过智能技术生成

ZGC(The Z Garbage Collector)

前言

ZGC是G1后新推出的垃圾回收器,jdk11仅支持linux,jdk14增加了对windows,mac OS的支持。

本文将通过对比G1来简单介绍ZGC。

什么是ZGC?

ZGC(The Z Garbage Collector)是标记-整理算法的并发垃圾回收器,官方解释ZGC只是个名字,没有意义。

 //开启ZGC
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC 

为什么要使用ZGC?

G1和ZGC都适用于大内存和多核cpu,为什么要使用ZGC呢?

  • ZGC相比G1的优点:

    1. 更低延迟:GC停顿时间更短,不超过 10ms
    2. 更大内存:堆内存支持范围更大(8MB-16TB)
为什么ZGC停顿时间比G1更短?

G1只有写屏障没有读屏障,复制移动的过程需要stop the world

zgc通过读屏障、remark标记和重定向表来并发拷贝非GC Roots对象,减少了stw

ZGC长什么样?

内存布局

ZGC和G1在堆内存的划分都基于region,不同于G1大小相同(1~32M)的region,ZGC动态分配region大小

  • Large(容量不固定,但是确定了之后只能被回收,无法再更改大小)

large容量不固定,一般为2mb的整数倍,存放置4MB或以上的大对象,每个Page只放一个对象

  • medium(32MB)

256kb < 存放对象 < 4mb

  • samll(2MB)

存放对象< 256k

G1通过Remembered Set记录Region与对象之间的双向引用关系,当引用发生更改的时候,需要同步更新Rememberd Set。这种操作会对内存造成较大负担。

ZGC通过整堆扫描和染色指针技术替换掉了Rememberd Set。

染色指针

Linux64位操作系统的高18位无法用来内存寻址,剩下的46位用来内存寻址依然支持64TB的内存空间,考虑64TB的内存对一个应用来讲过于浪费,oracle采用染色指针技术,占用剩余46位其中的4位作为标志位。linux剩下的42位依然支持4TB的内存寻址,这就是ZGC为何只支持64位操作系统且最大支持4TB内存的原因。

染色指针,通过使用指针的高位作为加载屏障(Load Barrier)来标记GC过程中的状态,在读取对象时,如果指针的颜色不对,屏障就先把指针更新为有效地址再返回,如此就只有单个对象读取时有概率被减速,避免了整体的STW。

在gc周期性更换,这样可以不要重复去复原(就像以前survivor的复制回收算法,这次用mark0表示,下次用mark1,在用mark1标记时把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值