为什么我的Java应用程序在Red Hat Linux上无法使用大页面?

3

我尝试了这个简单的命令:

 java -XX:+UseLargePages -Xms2g -version

I receive the error:

Java HotSpot(TM) 64-Bit Server VM warning: Failed to reserve 
shared memory (errno = 12).

但是如果没有大页面,它可以正常工作。

meminfo输出:

HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

正如您所看到的,"HugePages_Total"为0。因此,您的操作系统无法使用巨大页面,因为它已配置。您需要更改vm.nr_hugepages sysctl参数以分配一定数量的页面。将其设置在适当的/etc配置文件中,并重新启动以确保内核能够为巨大页面分配那么多内存。之后,如果HugePages_Total仍然为0,则可能没有足够的RAM来为您想要保留的巨大页面数量预留页面。另请参阅您的操作系统文档以设置巨大页面(甚至可以在引导过程中更早地完成)。 - Huygens
2个回答

4
为了在Linux上使用大页面,需要满足以下两个条件(参见Oracle文档): 1)共享内存的最大可用量shmmax需要大于JVM堆大小。 2)必须启用大页面并且有足够的大页面来支持JVM堆。
shmmax的运行时设置位于/proc/sys/kernel/shmmax。 hugepages数量的运行时设置位于/proc/sys/vm/nr_hugepages。
如果您希望这些设置在重启后继续有效,则需要通过sysctl进行设置。
因此,如果您指定了4GB的最大堆大小,则shmmax需要大于等于4GB,并且使用2MB页面时,nr_hugepages需要大于等于2K。
您的命令行还应指定最大堆大小。

@user710818 你确认在设置完成并启动Java程序之前,meminfo报告的“HugePages_Total”页面总数足够吗? - Huygens

-1

它无法工作,因为您的巨大页面仅为2MB(2048 kB),而您的堆大小最小为2 GB。


你尝试过使用2KB的最大堆或最小堆吗?实际上,最大堆才是重点。默认的最大堆大小取决于许多因素,但肯定会大于2KB。请参考http://docs.oracle.com/javase/7/docs/technotes/guides/vm/gc-ergonomics.html。 - Brett Okken
1
meminfo输出中的2MB是1页的大小(而不是默认的4k)。因此,您的答案是不正确的。 - Huygens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接