无法使用-XX:+ UseLargePages创建JVM

时间:2012-06-27 16:15:37

标签: jvm debian jvm-arguments large-object-heap huge-pages

我有一个目前以14GB堆运行的Java服务。我很想尝试-XX:+UseLargePages选项,看看这可能会如何影响系统的性能。我使用适当的共享内存和页面值(这些也可以使用by Oracle计算)按照an online tool所述配置操作系统。

配置操作系统后,我可以看到它将预期的内存量分配为大页面。但是,启动设置了-XX:+UseLargePages选项的VM始终会导致以下错误之一:

-Xms / -Xmx几乎等于巨大的页面分配时:

    Failed to reserve shared memory (errno = 28). // 'No space left on device'

-Xms / -Xmx小于大页面分配时:

    Failed to reserve shared memory (errno = 12). // 'Out of memory'

我确实尝试引入一些余地 - 所以在32GB系统上,我分配了24GB的共享内存和大页面,用于配置20GB堆的JVM,目前只使用了14GB。我还验证了执行JVM的用户确实拥有与/proc/sys/vm/hugetlb_shm_group一致的组权限。

任何人都可以给我一些关于我可能出错的地方以及我接下来可以尝试的内容吗?

分配/利用率:

  • -Xms / -Xmx - 20GB
  • 利用堆 - 14GB
  • /proc/sys/kernel/shmmax - 25769803776(24GB)
  • /proc/sys/vm/nr_hugepages - 12288

环境:

  • 系统内存 - 32GB
  • 系统页面大小 - 2048KB
  • debian 2.6.26-2-amd64
  • Sun JVM 1.6.0_20-b02

解决方案

感谢@jfgagne提供了解决方案的答案。除了 /proc/sys/kernel/shmall设置(指定为4KB页面)之外,我还必须按照Thomas' blog中的说明向/etc/security/limits.conf添加条目。但是,当我的应用程序使用jsvc启动时,我还必须复制root用户的设置(请注意,限制以KB为单位):

    root       soft memlock 25165824
    root       hard memlock 25165824
    pellegrino soft memlock 25165824
    pellegrino hard memlock 25165824

还值得一提的是,可以通过使用-version参数启动JVM来快速测试设置:

    java -XX:+UseLargePages -Xmx20g -version

1 个答案:

答案 0 :(得分:7)

当你使用Java的大页面时,不仅有使用大页面的堆,而且还有PermGen:不要忘记为它分配空间。这似乎是为什么当你将Xmx设置在接近大页面数量时,你会有一个不同的错误消息。

还有一个shmall内核参数需要设置,你没有提到,也许它阻止了你。在您的情况下,您应将其设置为6291456。

最后要说的是:当使用大页面时,Xms参数不再使用:Java使用大页面保留共享内存中的所有Xmx