gpt4 book ai didi

Java在真正内存不足之前抛出内存不足异常?

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:02 24 4
gpt4 key购买 nike

我希望创建一个大的 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)];

当以 10M 的堆大小运行时,这会抛出 OutOfMemoryException,尽管 printlns 的输出是:

9487176
9273344

我意识到数组会有一些开销,但不是 200k,对吗?为什么 java 无法为它声称有足够空间的东西分配内存?在 Java 运行它之前,我必须将减去的常量设置为 4M 左右(此时 printlns 看起来更像: 9487176 5472256)

更令人困惑的是,如果我用二维数组替换缓冲区:

buffers = new int[numBuffers][BUFFER_SIZE / 4];

然后它使用上面显示的 200k 减法毫无怨言地运行 - 即使两个数组中存储的整数数量相同(并且二维数组的开销不会大于一维数组的开销,因为它有所有这些对其他数组的引用要存储)。

有什么想法吗?

最佳答案

VM 会将堆内存划分为不同的区域(主要用于垃圾收集器),因此当您尝试分配几乎整个堆大小的单个对象时,您将耗尽内存。

另外,JRE 已经用完了一些内存。 200k 对于当今的内存大小算不了什么,对于大多数应用程序而言,10M 堆几乎小得不切实际。

数组的实际开销相对较小,在 32 位 VM 上它的 12 字节 IIRC(加上如果大小小于最小粒度,即 AFAIK 8 字节,则会浪费什么)。所以在最坏的情况下,每个数组的开销大约为 19 字节。

请注意,Java 没有 2D(多维)数组,它在内部将其实现为数组的数组。

关于Java在真正内存不足之前抛出内存不足异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com