【发布时间】:2023-03-11 19:17:02
【问题描述】:
对于启发式预计算表,我需要一个包含 1504935936 个条目的字节数组。这应该需要大约 1.5 GB 的内存。
public class Main{
public static void main(String[] args){
byte[] arr = new byte[1504935936];
}
}
如果我为程序提供 2 GB 的 RAM,为什么会出现“OutOfMemoryError: Java heap space”-异常
java -Xmx2048M Main
与
java -Xmx2153M Main
它有效。为什么需要这么多内存?
【问题讨论】:
-
要分配一个对象,堆中必须有那么多可用的连续空间。如果堆是 2G,那么几乎不可能有 1.5G 的连续空间。 (此外,各种平台对单个对象的最大大小有其他限制,具体取决于它们的地址转换硬件的工作方式。)
-
-
@vanza - 几乎所有东西都有一个例外。但是任何允许不连续分配数组的 JVM 都可能是为微型系统设计的。允许这样做会对性能产生重大(负面)影响。
-
只是出于好奇,您在做什么需要特定数量的条目?