【问题标题】:Why maximum size of an java array is Integer.MAX_VALUE/7?为什么 java 数组的最大大小是 Integer.MAX_VALUE/7?
【发布时间】:2018-01-20 19:35:25
【问题描述】:

我很惊讶为什么在我的机器上,数组的最大大小是 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

【问题讨论】:

  • 您的最大堆大小设置为多少?
  • @OliverCharlesworth 更新了详细信息。
  • @cloudwalker 我已经在我的问题中提到了该链接。只有当我发现该链接没有帮助时,我才开始创建一个新问题。
  • 亲爱的投反对票的人,如果有人能解释我的反对意见,我会感到非常安慰!!!!

标签: java arrays


【解决方案1】:

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

【讨论】:

  • 我遇到了需要存储大约 300mb xml 文件的情况。由于 String 仅由 char[] 支持,并且 char[] 可以消耗的最大值约为 20 亿 * 2byte = 4GB。将这么大的文件存储到 String 实例中会是一种不好的做法吗?
猜你喜欢
  • 2016-06-15
  • 2017-07-23
  • 2023-03-08
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2020-03-06
  • 2011-06-04
相关资源
最近更新 更多