java - 64 位 JVM 限制为 300GB 内存?

标签 java memory-management jvm cluster-computing

我正在尝试在可以为我提供高达 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/

相关文章:

java - 检查数组中的字符以构建回文列表

java - 如果我在 Android 中使用 SSLSocket 并将密码硬编码到源代码中的信任库,那不安全吗?

java - G1算法中的 memset 有什么用?

java - hibernate - session 已关闭

java - android代码并排合并两个视频并将其作为一个视频(只需要一个音频)

.net - 在处理阻塞过程时管理线程和内存使用情况

c++ - 在 C++ 中定义 float 的静态数组

c - 内存搜索器功能中毫无根据的段错误

java - ActiveMQ 嵌入式与独立性能

java - 垃圾收集器如何更新推送到操作数堆栈的引用?