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