当前位置: 首页 > 知识库问答 >
问题:

为什么 Java 数组的最大大小是整数.MAX值/7?

端木骞尧
2023-03-14

我有点惊讶地看到为什么在我的机器上,数组的最大大小是整数.MAX_VALUE/7
我知道数组是由整数索引的,所以数组大小不能大于整数.MAX_VALUE。我还阅读了一些堆栈溢出讨论,我发现它在JVM上有所不同,并且JVM使用了一些(5-8咬)。
在这种情况下,最大值也应为整数.MAX_VALUE-8

介于整数.MAX_VALUE-2整数.MAX_VALUE/7 之间的任何值都会给我错误:线程“主”java.lang.Out内存中的异常错误: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

共有1个答案

逄烨
2023-03-14

正如cloudworker已经提到的,这里解释了数组的真正限制:Java数组有最大大小吗?

在您的例子中,1GB的堆空间不足以容纳如此巨大的数组。

我不知道JVM中到底运行了哪些进程,但我可以推断:

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

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

 类似资料:
  • null 请在此基础上向我澄清。谢谢你的合作。

  • 问题内容: 我正在学习Java 8文档。我知道最大数组大小定义为均值2 ^ 31 – 8 = 2147483639 。然后,我集中讨论了为什么要减去8 或减去? 有些人根据文档给出了一些逻辑。因此,对于标题字,减去8。但是在这种情况下,如果标题字需要大于8,那么答案是什么? 请在此基础上澄清我。预先感谢您的合作。 问题答案: 阅读上述有关Java内存管理的文章,其中清楚指出 我认为这适用于Arra

  • 问题内容: 在C中,整数(对于32位计算机)为32位,范围为-32,768至+32,767。在Java中,整数(long)也是32位,但范围为-2,147,483,648至+2,147,483,647。 我不了解Java中的范围有何不同,即使位数相同。有人可以解释吗? 问题答案: 在C语言中,语言本身无法确定某些数据类型的表示形式。它因机器而异,在嵌入式系统上int可以为16位宽,尽管通常为32位

  • 我试图从Geeksforgeeks中解决最大整数值问题。 问题如下:给定一个数字(0-9)的字符串S,您的任务是找到可以从字符串中获得的最大值,方法是将“*”或“”运算符放在数字之间,同时从字符串的左到右遍历并一次拾取一个数字。 输入:输入的第一行包含T表示测试用例的数量。T测试用例紧随其后。每个测试用例包含一行表示字符串的输入。 输出:对于每个测试用例,打印获得的最大值。 这就是我所做的: 输入

  • 问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。

  • 问题内容: 我正在寻找python中整数的最小值和最大值。例如,在Java中,我们有和。python中是否有类似的东西? 问题答案: Python 3 在Python 3中,此问题不适用。普通int类型是无界的。 但是,你实际上可能正在寻找有关当前解释器的字长的信息,在大多数情况下,该信息将与机器的字长相同。该信息在Python 3中仍以形式提供,这是一个有符号的单词可以表示的最大值。等效地,它是