为什么java数组的最大大小是Integer.MAX_VALUE / 7?

时间:2018-01-20 19:35:25

标签: java arrays

我很惊讶地发现为什么在我的机器上,阵列的最大尺寸是Integer.MAX_VALUE / 7
我知道数组是由整数索引的,因此数组大小不能大于Integer.MAX_VALUE。我还阅读了一些stackoverflow讨论,其中我发现它在JVM上有所不同,JVM使用了一些(5-8个)。 在这种情况下,最大值应为Integer.MAX_VALUE-8

Integer.MAX_VALUE-2Integer.MAX_VALUE/7之间的任何值都会给我错误:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

int[] arr = new int[Integer.MAX_VALUE/7];

这是我可以在我的机器上分配给数组的最大值。具体原因是什么?

更新 我正在运行eclipse中的代码,其默认堆大小为1024Mb。以下是我的环境中的更多详细信息:

System.out.println(Runtime.getRuntime().totalMemory()/(1024*3));
System.out.println(Runtime.getRuntime().freeMemory()/(1024*3));
System.out.println(Runtime.getRuntime().maxMemory()/(1024*3));

给出输出:

40618
40195
594773

1 个答案:

答案 0 :(得分:2)

正如cloudworker已经提到的,数组的真正限制在这里解释:Do Java arrays have a maximum size?

在你的情况下,1GB对于巨大的数组而言只是没有足够的堆空间。

我不知道在JVM中运行了哪些确切的进程,但是从我能够计算的内容开始:

Integer.MAX_VALUE= ~2 billions
int = 4bytes
2billions*4bytes=8billions bytes = 8GB memory

使用1GB的堆空间,你应该能够有〜/ 8的MAX_VALUE。 (我认为你实际上可以获得超过/ 8的原因是JVM中的一些优化)