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 移植铺平道路。这些更改在准备性增强中进行了描述,以使审核更加容易: