我有一个应用程序将使用 3 亿大小的 HashMap 。为此,我初始化了 JVM,初始堆大小和最大堆大小均为 16 GB,即 (java -Xms16384M -Xmx16384M),但我收到了 java OutOfMemoryError
。我的机器有 32 GB RAM,安装了 RedHat Linux 操作系统。我观察到 JVM 仅使用 Linux 中“top”命令中 RAM 的 25%,即 8GB,即使我将其设置为 16GB,它也仅使用 8GB。
我想知道 JVM 是否限制了 RAM?
如何配置 JVM 以使用给定的完整最小和最大堆大小?
最佳答案
你能试试这个程序吗?
System.out.println("Max memory "+Runtime.getRuntime().maxMemory()/100 /1000+" MB.");
int mb = 0;
try {
List<byte[]> bytes = new ArrayList<>();
while (true) {
bytes.add(new byte[1000 * 1000]);
mb++;
}
} catch (OutOfMemoryError expected) {
}
System.out.println("OOME after " + mb + " MB allocated");
它会根据您的设置打印什么?对于 -mx8g
我得到
Max memory 7635 MB.
OOME after 7025 MB allocated
对于-mx12g
我得到
Max memory 11453 MB.
OOME after 10012 MB allocated
使用-mx12g -XX:MaxNewSize=512m
我得到
Max memory 12705 MB.
OOME after 12863 MB allocated
关于java - java 内存不足错误?即使我给了 JVM 足够的初始和最大内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522082/