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

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

我有一个Java服务,当前以14GB的堆运行。我热衷于尝试使用-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
    

    最佳答案

    当您在Java中使用大页面时,不仅有使用大页面的堆,而且还有PermGen:请不要忘记为其分配空间。似乎这就是为什么在大页面数量附近设置Xmx时会有不同的errno消息的原因。

    还有一个shmall内核参数需要设置,而您没有提到,这可能是阻止您的原因。在您的情况下,应将其设置为6291456。

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

    关于jvm - 无法使用-XX :+UseLargePages enabled创建JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230701/

    相关文章:

    java - 在 log4j.properties 文件中设置 jvmargs

    java飞行记录器如何转储异常,FlightRecordingDumpOnUnhandledException

    java - 将 JVM 字节码往返于文本表示并返回的故障安全方式

    Java 在不退出 JVM 的情况下退出程序

    linux - Init.d 脚本导致启动挂起

    linux - 如何检查我的共享库中的哪些符号具有非位置无关代码 (PIC)?

    Java 使用命令行设置系统属性

    java - 字节码java虚拟机

    Java 优化 : speed of inner loops inconsistent?

    linux - 如何在 Debian 上卸载 xdebug?