在 Ubuntu Linux 3.2.0-25-virtual 上使用 Oracle Java 1.7.0_05,在具有 7.5 GB 内存的 amazon EC2 实例上,我们启动三个 java 实例,每个实例使用开关 -Xmx 2000m。
我们使用默认的 Ubuntu EC2 AMI 配置,没有交换空间。
这些实例运行几周后,其中一个实例卡住——可能是内存不足。但我的问题不是寻找内存泄漏。
当我们尝试重新启动应用程序时,java 给我们一条消息,指出它无法分配 2000 mb 内存。我们通过重新启动服务器解决了该问题。
换句话说,2000 + 2000 + 2000 > 7500?
我们已经见过这个问题两次,很抱歉地报告我们没有良好的诊断方法。如果只剩下两个 java 进程,每个进程最多使用 2000 MB,我们怎么会用完空间呢?下次再出现这个问题时,我们应该如何进行诊断呢?我希望我有一个“free -h”输出,在我们无法启动程序时获取,并在此处显示。
TIA。
最佳答案
-Xmx 设置 JVM 堆的最大大小,而不是 java
进程的最大大小,除了可供应用程序使用的堆之外,它还会分配更多内存:自己的内存、永久代、JNI 库中分配的内容等。
关于Linux 上的 Java -Xmx 选项不限制内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389560/