跳到主要内容

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

概括

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

非目标

支持早于版本 1803 的 Windows 10 和 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 中引入的。将不会实现对旧版本 Windows 的 ZGC 支持。

  • 支持映射和取消映射堆的任意部分。 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() 的实现