Java JVM ZGC垃圾回收器

1.ZGC简介

ZGC(Z Garbage Collector)是一款基于Region内存布局(有点类似于G1)的,不设置分代的,使用了读屏障、染色体指针和内存多重映射等技术来实现可并发标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。旨在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小都可以把垃圾收集的停顿时间限制在10ms以内的低延迟。

主要特点:

1.ZGC不分代,每次垃圾回收都是全量内存进行标记,每次相当于Full GC,但回收的时候可采取部分回收的策略;
2.内存分区管理,分成小中大三种分区粒度;
3.仅支持Linux 64位系统,不支持Window;
4.具有读屏障,实现并发标记和并发转移的处理;
5.不支持指针压缩;
6.具有染色体指针,实现并发标记、转移和重定位;
7.小分区优先回收,中分区和大分区尽量不回收;
8.针对多核,支持非统一内存访问,即NUMA(Non-Uniform Memory Access),小分区优先分配到CPU的本地内存中,中大分区则交由操作系统处理。

1.1 Java各种GC的并发比较

Java各种GC的并发比较.jpg

2.ZGC实现原理

1.2 ZGC的Region

  • Small Region: 固定为2MB,存放小于256KB的小对象;
  • Medium Region: 固定为32MB,存放大于等于256KB且小于4MB的对象;
  • Large Region: 容量固定,但必须是2MB的整数倍,存放大于等于4MB的对象,一个Large Region只会存放一个大对象,因此实际Large Region可能会小于Medium Region,最小为4MB,Large Region是不会被重分配,因为复制一个大对象代价昂贵。
ZGC-Region.jpg

1.2 ZGC的染色体指针(colored pointer)

染色体指针.jpg
  • Finalizable:标识对象只能通过finalizable()访问;
  • Remapped:标识引用是最新的,即对象是否在重定向后的集合中;
  • Marked1:用于标记可达对象;
  • Marked0:保留位,将来可能会使用。

推荐阅读更多精彩内容