Java数组有最大大小吗?

Java数组有最大大小吗?,java,arrays,Java,Arrays,Java数组可以包含的元素数量是否有限制?如果是,那是什么?实际上有两个限制。一是数组可索引的最大元素数,二是应用程序可用的内存量。根据可用内存量和其他数据结构使用的内存量,在达到最大可寻址数组元素之前,您可能会达到内存限制。没有看到正确的答案,即使它很容易测试 在最近的热点虚拟机中,正确答案是Integer.MAX\u VALUE-5。一旦你超越了这一点: public class Foo { public static void main(String[] args) { Obj

Java数组可以包含的元素数量是否有限制?如果是,那是什么?

实际上有两个限制。一是数组可索引的最大元素数,二是应用程序可用的内存量。根据可用内存量和其他数据结构使用的内存量,在达到最大可寻址数组元素之前,您可能会达到内存限制。

没有看到正确的答案,即使它很容易测试

在最近的热点虚拟机中,正确答案是
Integer.MAX\u VALUE-5
。一旦你超越了这一点:

public class Foo {
  public static void main(String[] args) {
    Object[] array = new Object[Integer.MAX_VALUE - 4];
  }
}
你会得到:

Exception in thread "main" java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit
这(当然)完全依赖于虚拟机

浏览OpenJDK 7和8、、和的源代码,您可以看到重复的声明:

这是由Martin Buchholz(谷歌)添加的;由Chris Hegarty(Oracle)审查

因此,也许我们可以说最大的“安全”数将是2147483639
Integer.MAX_VALUE-8
),并且“尝试分配更大的数组可能会导致”


(是的,Buchholz的独立声明不包括支持证据,因此这是一个即使在OpenJDK本身内计算的结果,我们可以看到这样的代码,它表明
MAX\u ARRAY\u SIZE
还没有真正的用途。)

一个
数组的最大元素数是
(2^31)−1
2 147 483 647

根据本文:

Java因不支持超过231个数组而受到批评−1(约21亿)个元素。这是语言的局限性;Java语言规范第10.4节规定:

数组必须由int值索引。。。尝试访问阵列 具有长索引值的组件会导致编译时错误


支持大型阵列还需要对JVM进行更改。这种限制表现在以下方面:集合限制为20亿个元素,无法存储大于2 GiB的文件。Java还缺少真正的多维数组(由单个间接寻址访问的连续分配的单个内存块),这限制了科学和技术计算的性能。

数组是非负整数索引的,因此您可以访问的最大数组大小将是
整数。最大值
。另一个问题是可以创建多大的数组。它取决于
JVM
可用的最大内存以及数组的内容类型。例如,每个数组元素都有其大小<代码>字节=1字节
int=4字节
对象引用=4字节(在32位系统上)

因此,如果计算机上有可用的
1MB
内存,可以分配一个
字节[1024*1024]
对象[256*1024]
数组

回答您的问题-您可以分配大小的数组(最大可用内存/数组项的大小)


摘要-理论上,数组的最大大小为
整数。最大值
。实际上,这取决于JVM有多少内存,以及有多少内存已经分配给了其他对象。

我试图创建这样的字节数组

byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
使用此运行配置:

-Xms4G -Xmx4G
和java版本:

Openjdk版本“1.8.0_141”

OpenJDK运行时环境(build 1.8.0_141-b16)

OpenJDK 64位服务器虚拟机(构建25.141-b16,混合模式)

它仅适用于x>=2,这意味着数组的最大大小为整数。MAX_VALUE-2

高于该值的值将给出

线程“main”java.lang.OutOfMemoryError中出现异常:请求的数组大小超过VM限制 Main.Main(Main.java:6)


实际上,这是java限制,它的上限为2^30-4,即1073741820。不是2^31-1。不知道为什么,但我在jdk上手动测试了它


编辑:修复了-1到-4的问题,在windows jvm上进行了检查

是的,java数组有限制。Java使用整数作为数组的索引,JVM存储的最大整数为2^32。因此,可以在数组中存储2147483647个元素


如果需要的长度超过最大长度,可以使用两个不同的数组,但推荐的方法是将数据存储到文件中。因为在文件中存储数据没有限制。因为存储在存储驱动程序中但阵列中的文件存储在JVM中。JVM为程序执行提供了有限的空间

Java数组有一个限制,因为它是一个整数数组,这意味着它在数组中最多有2147483647个元素

我认为向下投票的想法没有意义,除非我们愿意对完全错误的答案进行向下投票。在现实世界中,五个字节的差异真的很重要吗?不,当然不重要。但让我担心的是,人们愿意“权威地”给出答案,甚至不去尝试它是否真的有效。至于内存限制,嗯,嗯。这就像你问我“你能吃多少葡萄?”我说“好吧,这取决于当时冰箱里有多少。”你知道为什么它不会给你那五个字节吗?这是否一定是Java中经常发生的事情,或者只是与计算机的内存或其他东西有关?@Kevin Bourrillion:这似乎已经改变了,使用Oracle 1.7.0,我最多可以分配
MAX\u VALUE-2
元素。这与我分配的内容无关,我真的很想知道VM可以使用这两个“东西”做什么(长度不适合2个字节)。@TomášZato最新的
Integer.MAX_VALUE+1
,您将有一个整数溢出。Java中的数组大小是
int
,而不是
long
;无论在数组中存储何种数据类型、字节或引用。字符串只是对象引用。JDK 6及更高版本中数组中的最大元素数为
Integer.MAX_VALUE-2
=2 147 483 645如果您使用
-Xmx13G运行这样一个数组,Java将成功地分配它<
-Xms4G -Xmx4G