Skip to content

JEP 365: ZGC on Windows (Experimental) | Windows 上的 ZGC

摘要

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

非目标

不支持早于 Windows 10 和 Windows Server 1803 的旧版本,因为这些旧版本缺乏用于占位符内存保留的必需 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 上)。

  • 支持提交和取消提交堆的任意部分。 在 Java 程序运行时,ZGC 可以动态地提交和取消提交物理内存。为了支持这些操作,物理内存将被划分为多个分页文件段,并由这些段支持。每个分页文件段对应于一个 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() 的实现