一文读懂ZGC

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标记时把

你可能感兴趣的:(垃圾回收,JVM,ZGC,垃圾回收器,gc,jvm,G1)