【发布时间】:2018-08-26 05:40:43
【问题描述】:
我想试验一下 Java 中的 -Xmx 选项,并创建了一个简单的测试程序,它每次分配 1 Mib 直到内存耗尽。
import java.util.Vector;
public class MemoryMuncher {
static final int MiB = 1048576;
static final int accellerator = 1;
public static void main(String[] args) {
Vector victor = new Vector();
int i = 1;
try {
while (true) {
byte roger[] = new byte[MiB * accellerator];
victor.add(roger);
Runtime rt = Runtime.getRuntime();
System.out.printf("free: %,6d\t\ttotal: %,6d\t\tallocated: %,6d \n", rt.freeMemory()/MiB, rt.totalMemory()/MiB, i++*accellerator);
}
} catch (OutOfMemoryError e) {
System.out.println(e);
}
}
}
当我使用 -Xmx 选项运行程序时,我注意到 Java 8 (1.8.0.131) 和 Java 9 (9.0.1) 之间的行为差异。
Java 8 的工作方式接近我的预期。当我使用 -Xmx256M 运行程序时,它会在抛出 OutOfMemoryError 之前分配 233MiB。
free: 361 total: 368 allocated: 1
free: 360 total: 368 allocated: 2
...
free: 12 total: 245 allocated: 232
free: 11 total: 245 allocated: 233
java.lang.OutOfMemoryError: Java heap space
但是,当我使用 Java 9 运行相同的程序时,它只获得了大约 中途 (127 MiB),然后我得到了异常。这是一致的。如果我将 -Xmx 更改为 512M 或 1024M,它只会达到该数量的一半(分别为 255 MiB 和 510 MiB)。我无法解释这种行为。
free: 250 total: 256 allocated: 1
free: 247 total: 256 allocated: 2
...
free: 2 total: 256 allocated: 126
free: 1 total: 256 allocated: 127
java.lang.OutOfMemoryError: Java heap space
我在文档中搜索了 Java 8 和 Java 9 之间内存管理方面的任何变化,但没有找到任何东西。
有没有人知道为什么 Java 9 在某些情况下会与以前的 Java 版本不同地管理/分配内存?
【问题讨论】:
-
你为什么关心 Java 9?这是eol。 Java 11 已经发布。
-
您是否在 Java 10 和/或 Java 11 早期版本之一上观察到相同的行为?
-
我确实在 Java 10 中看到了同样的情况。我在示例中使用了 Java 9,因为这就是变化开始的地方。
标签: java memory memory-management dynamic-memory-allocation