JEP 316:替代内存设备上的堆分配
概括
使 HotSpot VM 能够在用户指定的备用内存设备(例如 NV-DIMM)上分配 Java 对象堆。
动机
随着廉价 NV-DIMM 内存的出现,未来的系统可能会配备异构内存架构。此类技术的一个例子是英特尔的 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)上执行。