跳到主要内容

JEP 364:macOS 上的 ZGC(实验)

概括

将 ZGC 垃圾收集器移植到 macOS。

动机

虽然我们期望需要 ZGC 可扩展性的用户使用基于 Linux 的环境,但开发人员在部署应用程序之前使用 Mac 进行本地开发和测试的情况并不少见。还有一些用户希望使用 ZGC 运行 IDE 等桌面应用程序。

描述

ZGC 的 macOS 实现由两部分组成:

  • 支持 macOS 上的多重映射内存。 ZGC 设计大量使用了彩色指针,因此我们需要一种在 macOS 上将多个虚拟地址(在算法中包含不同颜色)映射到同一物理内存的方法。为此,我们将使用 mach 微内核 mach_vm_remap API。堆的物理内存维护在单独的地址视图中,概念上类似于文件描述符,但驻留在(大部分)连续的虚拟地址中。该内存被重新映射到内存的各种 ZGC 视图中,代表算法的不同指针颜色。

  • ZGC 支持不连续内存预留。在Linux上,我们在初始化期间保留了16TB的虚拟地址空间。为了实现这一点,我们假设没有共享库被映射到所需的地址空间。在默认的 Linux 配置上,这是一个安全的假设。然而,在 macOS 上,ASLR 机制侵入了我们的地址空间,因此 ZGC 必须允许堆预留是不连续的。共享 VM 代码还必须停止假设 GC 实现使用单个连续内存预留。因此,诸如is_in_reserved()reserved_region()和 之类的 GC APIbase()将从CollectedHeap.

备择方案

我们尝试使用 POSIX 共享内存对象的替代原型。它使用文件描述符方法来实现多映射内存。我们放弃了这种方法,因为,a) 它不支持大页面,b) ftruncate 的 macOS 实现只能调用一次来设置文件的大小,这使得取消提交内存变得不可能。

测试

通常在 Linux 上为 ZGC 运行的测试也将在 macOS 上运行。

依赖关系

需要清除虚拟机中 GC 具有不连续内存预留的假设,为 macOS 移植铺平道路。这些更改在准备性增强中进行了描述,以使审核更加容易:

  • 8229027:改进 JNIHandleBlock::oops_do 区分 oops 和非 oops 的方式

  • 8229278:改进 hs_err 位置打印以减少 GC 内部结构的假设

  • 8229189:改进 JFR 泄漏分析器跟踪以处理不连续的堆

  • 8224815:删除 CollectedHeap::is_in_reserved() 的非 GC 使用

  • 8224820:ZGC:支持不连续堆预留