本文主要介绍了ZGC中运用到的相关技术和原理,包括染色指针、多视图映射、ZGC中各个线程的作用等。

简介

   ZGC在一款在JDK 11中引入的新一代垃圾回收处理器,它是2017年由Oracle公司贡献给OpenJDK社区的,正式成为OpenJDK的开源项目,也就是JEP 333,目前它被明确地标记为实验性质(意味着还不成熟)。新一代的垃圾回收器一经发布,虽然尚不成熟,但是仍然阻挡不了众多Java程序员对它的追捧。

   官方介绍如下:

The Z Garbage Collector (ZGC) is a scalable low latency garbage collector. ZGC performs all expensive work concurrently, without stopping the execution of application threads for more than 10ms, which makes is suitable for applications which require low latency and/or use a very large heap (multi-terabytes).

   作为新一代可扩展的低延迟垃圾回收器,ZGC把一切能并发处理的工作都并发执行,来完成预期的三大目标:

  • 亚毫秒级的停顿时间(停顿时间小于10ms)
  • 停顿时间不会随着堆的大小、活跃对象的大小而增加
  • 支持处理大小从 8MB 到 16TB 的堆

ZGC的原理

内存管理

ZGC为了能高效、灵活地管理内存,实现了两级内存管理:虚拟内存物理内存,并且实现了物理内存和虚拟内存的映射关系。这和操作系统中虚拟地址和物理地址设计思路基本一致。ZGC主要的改进点就是重新定义了虚拟内存和物理内存的映射关系。

着色指针(Color Pointers)

着色指针是一种将信息存储在指针中的技术,是ZGC的核心技术之一。

我们知道ZGC目前仅支持64位Linux,最多管理4TB的内存。不知道你有没有注意到这个地方似乎有点问题,64位系统支持的内存远超过4TB,那么为什么我们一直强调它只能支持4TB的内存,为什么不使用更多的虚拟内存?

原因是ZGC实际上并没有用到整个地址空间,而是对整个内存空间进行划分,主要分为[0~4TB)、[4TB~8TB)、[8TB~12TB)和[16TB~20TB)。其中[0~4TB)对应的是Java的堆空间;[4TB~8TB)、[8TB~12TB)和[16TB~20TB)分别对应Marked0、Marked1和Remapped这3个视图。ZGC中低42位(第0~41位)用于描述真正的虚拟地址(这就是图2-2中提到的应用程序可以使用的堆空间),接着的4位(第42~45位)用于描述元数据,其实就是大家所说的Color Pointers,还有1位(第46位)目前暂时没有使用,最高17位(第47~63位)固定为0。

ZGC内存地址

ZGC内存地址

由于42位地址最大的寻址空间就是4TB,这就是ZGC一直宣称自己最大支持4TB内存的原因。这里还有视图的概念,Marked0、Marked1和Remapped就是3个视图,分别将第42、43、44位设置为1,就表示采用对应的视图。在ZGC中,这4位标记位的目的并不是用于地址寻址的,而是为了区分Marked0、Marked1和Remapped这3个视图。当然对于操作系统来说,这4位标记位代表了不同的虚拟地址空间,操作系统在寻址的时候会把标记位和虚拟地址结合使用。

多视图映射(Multi-Mapping)

ZGC虚拟地址和物理地址映射关系

ZGC虚拟地址和物理地址映射关系

多视图映射

ZGC线程

ZGC的应用

参考文献

  • 彭成寒.《新一代垃圾回收器ZGC设计与实现》. 机械工业出版社, 2019.
    The Z Garbage Collector
    [HotSpot Virtual Machine Garbage Collection Tuning Guide](

Q.E.D.