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

标签 java arrays

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

Integer.MAX_VALUE-2Integer.MAX_VALUE/7 之间的任何值都会给出错误:线程“main”java.lang 中出现异常。 OutOfMemoryError:Java 堆空间

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

最佳答案

正如 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 中的一些优化)

关于java - 为什么java数组的最大大小是Integer.MAX_VALUE/7?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48360302/

相关文章:

java - 检查并返回 boolean 值

java - 如何使用 DOM 解析嵌套元素

Java:如果变量为空(来自用户输入);休息;否则继续主要方法

java - 如何在不使用 Array.sort :Java 的情况下按字母顺序对数组进行排序

javascript - 在javascript中将复杂类型的字符串数组转换为json

arrays - 在 Scala 中表示欧几里得距离的最简单方法

java - 将 Google Play 服务更新到 8.1.0 后,Android studio/Gradle 项目无法构建

Java 比较器接口(interface)

arrays - 找到一种算法,根据排序后的状态对数组进行排序

arrays - 函数调用相同参数自己的参数(数组)Swift