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