跳到主要内容

JEP 365:Windows 上的 ZGC(实验性)

QWen Max 中英对照 JEP 365: ZGC on Windows (Experimental)

概述

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

非目标

支持 Windows 10 和低于 1803 版本的 Windows Server 并不是目标,因为旧版本缺少用于占位符内存预留的必要 API。

描述

ZGC 的大部分代码库与平台无关,不需要进行特定于 Windows 的更改。现有的 x64 负载屏障支持与操作系统无关,也可以在 Windows 上使用。需要移植的特定平台代码涉及如何保留地址空间以及如何将物理内存映射到保留的地址空间。Windows 的内存管理 API 与 POSIX API 不同,并且在某些方面灵活性较差。

ZGC 的 Windows 实现需要以下工作:

  • 支持多映射内存。 ZGC 使用彩色指针需要堆多映射的支持,以便相同的物理内存可以从进程地址空间中的多个不同位置访问。在 Windows 上,分页文件支持的内存为物理内存提供了一个身份(一个句柄),这与它被映射到的虚拟地址无关。使用这个身份标识,ZGC 可以将相同的物理内存映射到多个位置。

  • 支持将分页文件支持的内存映射到保留的地址空间。 Windows 的内存管理 API 不如 POSIX 的 mmap/munmap 灵活,特别是在将文件支持的内存映射到先前保留的地址空间区域时。为此,ZGC 将使用 Windows 的地址空间占位符概念。占位符概念是在 Windows 10 和 Windows Server 的 1803 版本中引入的。ZGC 不会实现对旧版本 Windows 的支持。

  • 支持映射和取消映射堆的任意部分。 ZGC 的堆布局结合其堆页面的动态调整大小(和重新调整大小)要求支持映射和取消映射任意堆粒度。这一需求与 Windows 地址空间占位符结合需要特别注意,因为占位符必须由程序显式拆分/合并,而不是像在 Linux 上那样由操作系统自动拆分/合并。

  • 支持提交和取消提交堆的任意部分。 ZGC 可以在 Java 程序运行时动态地提交和取消提交物理内存。为了支持这些操作,物理内存将被划分为并由多个分页文件段支持。每个分页文件段对应于一个 ZGC 堆粒度,并且可以独立于其他段进行提交和取消提交。

测试

通常在 Linux 上运行的 ZGC 测试也会在 Windows 上运行。

依赖

对共享代码的以下更改是先决条件:

  • 8232601: ZGC:参数化 ZGranuleMap 表的大小
  • 8232602: ZGC:使 ZGranuleMap 与 ZAddress 无关
  • 8232604: ZGC:使 ZVerifyViews 的映射和解映射更加精确
  • 8232648: ZGC:将 ATTRIBUTE_ALIGNED 移到声明的前面
  • 8232649: ZGC:向 ZMemoryManager 添加回调
  • 8232650: ZGC:为特定操作系统的代码添加初始化钩子
  • 8232651: 为 Windows 添加 os::processor_id() 的实现