我正在尝试在可以为我提供高达 1TB RAM 空间的集群计算环境(运行 CentOS 6.2 Final 版的 IBM LSF)上运行 Java 应用程序。
我可以创建一个最大内存高达 300GB (Xmx) 的 JVM,尽管我需要的不止这些(如果需要,我可以提供详细信息)。
但是,使用 Xmx 选项创建最大内存超过 300GB 的 JVM 似乎是不可能的。更具体地说,我收到了经典的错误消息:
Error occurred during initialization of VM.
Could not reserve enough space for object heap.
我的(64 位)JVM 的详细信息如下:
OpenJDK Runtime Environment (IcedTea6 1.10.6) (rhel-1.43.1.10.6.el6_2-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
我也尝试过使用 Java 7 64 位 JVM,但我遇到了完全相同的问题。
另外,我尝试创建一个JVM来运行一个HelloWorld.jar,但是如果你要求超过-Xmx300G,仍然无法创建JVM,所以我认为这与具体应用程序无关。
有人知道为什么我不能创建一个最大内存超过 300G 的 JVM 吗?
任何人都可以提出解决方案/解决方法吗?
最佳答案
我能想到几种可能的解释:
您系统上的其他应用程序正在使用太多内存,目前没有 300Gb 可用。
每个进程的内存大小可能存在资源限制。您可以使用
ulimit
进行检查。 (请注意,根据 this bug,如果每进程资源限制停止 JVM 分配堆区域,您将收到错误消息。)这也可能是“过度提交”问题;例如如果您的应用程序在虚拟环境中运行,并且由于来自其他虚拟环境的竞争过多,整个系统无法满足需求。
建议的其他一些想法(IMO)不太可能:
切换 JRE 不太可能产生任何影响。我从未听说过或见过特定 64 位 JVM 中的任意内存限制。
不太可能是因为没有足够的连续内存。当然不需要连续的物理内存。唯一的可能性可能是交换设备上的连续空间,但我不记得这是典型 Linux 操作系统的问题。
Can anyone please suggest a solution/workaround?
检查
ulimit
。编写一个小型 C 程序,尝试
malloc
大量内存,看看在失败之前可以分配多少。向系统(或管理程序)管理员寻求帮助。
关于java - 64 位 JVM 限制为 300GB 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711247/