JEP 316:在替代内存设备上进行堆分配
概述
启用 HotSpot 虚拟机在用户指定的替代内存设备(例如 NV-DIMM)上分配 Java 对象堆。
动机
随着廉价的 NV-DIMM 内存的出现,未来的系统可能会配备异构内存架构。此类技术的一个例子是 Intel 的 3D XPoint。这样的架构除了 DRAM 之外,还将具有一个或多个具有不同特性的非 DRAM 内存类型。
本 JEP 针对具有与 DRAM 相同语义(包括原子操作的语义)的替代内存设备,因此可以在不更改现有应用程序代码的情况下用于对象堆以替代 DRAM。所有其他内存结构(如代码堆、元空间、线程栈等)将继续驻留在 DRAM 中。
该提案的一些用例是:
-
在多 JVM 部署中,某些 JVM(如守护进程、服务等)的优先级低于其他 JVM。与 DRAM 相比,NV-DIMM 的访问延迟可能更高。低优先级的进程可以使用 NV-DIMM 内存作为堆,从而让高优先级的进程使用更多的 DRAM。
-
大数据和内存数据库等应用程序对内存的需求不断增加。这类应用程序可以将 NV-DIMM 用于堆,因为与 DRAM 相比,NV-DIMM 可能具有更大的容量,且成本更低。
描述
一些操作系统已经通过文件系统公开了非 DRAM 内存。例如 NTFS DAX 模式 和 ext4 DAX。这些文件系统中的内存映射文件绕过页面缓存,并提供了虚拟内存到设备上物理内存的直接映射。
为了在这样的内存中分配堆,我们可以添加一个新的选项 -XX:AllocateHeapAt=<path>
。此选项将获取文件系统中的路径,并使用内存映射来实现将对象堆分配到内存设备上的预期结果。该 JEP 并不打算在多个运行的 JVM 之间共享非易失性区域,也不打算在后续的 JVM 调用中重复使用同一区域。
现有的堆相关标志(如 -Xmx
、-Xms
等)和垃圾收集相关标志将继续像以前一样工作。
为确保应用安全,实现时必须确保文件系统中创建的文件具备以下条件:
- 受到正确权限的保护,防止其他用户访问它。
- 在任何可能的情况下,当应用程序终止时被删除。
测试
测试不一定需要任何特殊的内存;它可以在内存文件系统上执行,例如 ramfs 或 tmpfs。