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