Java 64位JVM限制为300GB内存?

Java 64位JVM限制为300GB内存?,java,memory-management,jvm,cluster-computing,Java,Memory Management,Jvm,Cluster Computing,我正在尝试在集群计算环境(运行CentOS 6.2最终版的IBM LSF)上运行Java应用程序,该环境最多可为我提供1TB的RAM空间 我可以创建一个最大内存为300GB(Xmx)的JVM,尽管我需要更多(如果需要,我可以提供详细信息) 然而,使用Xmx选项创建最大内存超过300GB的JVM似乎是不可能的。更具体地说,我得到了经典的错误消息: 初始化VM时出错 无法为对象堆保留足够的空间 我的(64位)JVM的详细信息如下: OpenJDK运行时环境(IcedTea6 1.10.6)(rhel

我正在尝试在集群计算环境(运行CentOS 6.2最终版的IBM LSF)上运行Java应用程序,该环境最多可为我提供1TB的RAM空间

我可以创建一个最大内存为300GB(Xmx)的JVM,尽管我需要更多(如果需要,我可以提供详细信息)

然而,使用Xmx选项创建最大内存超过300GB的JVM似乎是不可能的。更具体地说,我得到了经典的错误消息:

初始化VM时出错

无法为对象堆保留足够的空间

我的(64位)JVM的详细信息如下:

OpenJDK运行时环境(IcedTea6 1.10.6)(rhel-1.43.1.10.6.el6_2-x86_64)

OpenJDK 64位服务器虚拟机(构建20.0-b11,混合模式)

我也尝试过使用Java7 64位JVM,但我遇到了完全相同的问题

此外,我尝试创建一个JVM来运行HelloWorld.jar,但如果您要求的值超过-Xmx300G,JVM创建仍然失败,因此我认为这与特定的应用程序无关


有人知道为什么我不能创建一个最大内存超过300G的JVM吗

有谁能提出一个解决方案/解决方案吗?

如果您了解Java HotSpot VM的功能,它提到在64位VM上,只有64个地址位可供使用,因此最大Java堆大小取决于系统上存在的物理内存和交换空间的大小

如果从理论上进行计算,则可以拥有18446744073709551616MB的内存,但存在上述限制

您必须使用
-Xmx
命令来定义JVM的最大堆大小,Java在64位JVM上使用64+30%=83.2MB

我试着在我的机器上按命令操作,它看起来工作得很好

java -Xmx500g com.test.TestClass

我还试图以TB为单位定义最大堆,但它不起作用。

我可以想出几个可能的解释:

  • 系统上的其他应用程序占用的内存太多,目前没有300Gb可用内存

  • 每个进程的内存大小可能有资源限制。您可以使用
    ulimit
    进行检查。(请注意,根据,如果每进程资源限制停止JVM分配堆区域,您将收到错误消息。)

  • 这也可能是一个“过度承诺”的问题;e、 g.如果您的应用程序运行在虚拟环境中,而系统作为一个整体无法满足需求,因为来自其他虚拟环境的竞争太多


(国际海事组织)不太可能提出另外两个想法:

  • 切换JRE不太可能产生任何影响。我从未听说或见过特定64位JVM中存在任意内存限制

  • 这不太可能是因为没有足够的连续内存。当然,不需要连续的物理内存。唯一的可能是交换设备上的连续空间,但我不记得这是典型Linux操作系统的问题


有人能提出解决方案/解决方法吗

  • 检查
    ulimit

  • 编写一个小型C程序,尝试
    malloc
    大量内存,看看在失败之前可以分配多少内存

  • 请向系统(或虚拟机监控程序)管理员寻求帮助


以JVM进程的用户身份运行ulimit-a,并验证内核没有限制最大内存大小。您可能需要编辑/etc/security/limit.conf

,因为LSF不会将节点内存集中到单个共享空间中。你用的是别的东西。阅读某个东西的文档,因为它可能无法执行您要求它执行的操作。特别是,它可能无法分配跨越所有节点的单个连续内存区域。通常这是不必要的,因为应用程序会对malloc进行多次调用。但是为了简化事情,JVM希望通过一次有效地调用malloc为整个堆分配(或保留)一个连续区域。或者,它可能与您用来模拟巨型共享内存机器的任何东西有关。

(已编辑,请参阅添加的交换空间部分)

SHMMAX和SHMALL 由于您使用的是CentOS,您可能遇到了与上述
SHMMAX
SHMALL
内核设置类似的问题。在同一链接下有一个示例计算,用于获取和设置正确的
SHMALL
设置

连续存储器 某些用户已经报告说没有足够的连续内存可用,其他用户则表示这与此无关

我不确定CentOS上的JVM是否需要连续的内存块,碎片化内存可能会阻止JVM使用较大的max
Xmx
或start
Xms
内存设置启动,但互联网上的其他声明称这并不重要。我试图在我的48GB Windows工作站上证明或证明这一说法,但成功地以40GB的初始和最大设置启动了JVM。我很确定没有这种大小的连续块可用,但不同操作系统上的JVM可能会表现不同,因为每个操作系统的内存管理可能不同(即Windows通常会隐藏各个进程的物理地址)

查找最大的连续内存块 使用
/proc/meminfo
查找可用的最大连续内存块,请参阅
VmAllocChunk
下的值。在所有价值观中。如果您看到的值小于300GB,请尝试正好位于
VmAllocChunk
值之下的值

但是,通常这个数字高于物理可用内存(因为它是可用的虚拟内存值),它可能会给您一个误判。这是你可以保留的价值,但一旦你开始使用它,
stress --vm 2 --vm-bytes 300G --timeout 30s --verbose