我希望创建一个几乎填满 JVM 可用内存的大型 int 数组。以这段代码为例:
final int numBuffers = (int) ((runtime.freeMemory() - 200000L) / (BUFFER_SIZE));
System.out.println(runtime.freeMemory());
System.out.println(numBuffers*(BUFFER_SIZE/4)*4);
buffers = new int[numBuffers*(BUFFER_SIZE / 4)];
当以 10M 的堆大小运行时,这会引发 OutOfMemoryException,尽管 printlns 的输出是:
9487176
9273344
我意识到阵列会有一些开销,但肯定不是 200k 吗?为什么java无法为它声称有足够空间的东西分配内存?在 Java 运行它之前,我必须设置减去 4M 左右的常量(此时 printlns 看起来更像:9487176 5472256)
更令人困惑的是,如果我用 2D 数组替换缓冲区:
buffers = new int[numBuffers][BUFFER_SIZE / 4];
然后它使用上面显示的 200k 减法毫无怨言地运行 - 即使两个数组中存储的整数数量相同(并且 2D 数组的开销不会大于 1D 数组的开销,因为它得到了所有那些对要存储的其他数组的引用)。
有任何想法吗?