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的优点:
- 更低延迟:GC停顿时间更短,不超过 10ms
- 更大内存:堆内存支持范围更大(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标记时把