Java数组有最大大小吗?

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

220303 次浏览

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

使用

OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)

... 在MacOS上,答案似乎是Integer.MAX_VALUE - 2。一旦你超越了这一点:

cat > Foo.java << "END"
public class Foo {
public static void main(String[] args) {
boolean[] array = new boolean[Integer.MAX_VALUE - 1]; // too big
}
}
END
java -Xmx4g Foo.java

... 你会得到:

Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit

这(当然)完全依赖于vm。

浏览OpenJDK 7和8的源代码java.util.ArrayList.Hashtable.AbstractCollection.PriorityQueue.Vector,你可以看到这个.Hashtable0被重复:

/**
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

由Martin Buchholz(谷歌)在2010-05-09添加;由Chris Hegarty (Oracle)审阅。

因此,可能我们可以说最大的“安全”数字将是2 147 483 639 (Integer.MAX_VALUE - 8)并且“尝试分配更大的数组可能会导致OutOfMemoryError”。

(是的,Buchholz的独立声明不包括支持证据,所以这是一个计算出来的诉诸权威。,即使在OpenJDK本身,我们也可以看到像return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;这样的代码,这表明MAX_ARRAY_SIZE还没有真正的的用途。)

array的最大元素数是(2^31)−12 147 483 647

通过本文http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:

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

数组必须以int值为索引…访问数组的尝试 组件具有较长的索引值将导致编译时错误

支持大型数组还需要对JVM进行更改。这种限制体现在一些方面,例如集合被限制在20亿个元素,以及无法内存大于2 GiB的映射文件。Java还缺乏真正的多维数组(通过单一间接方式访问连续分配的单个内存块),这限制了科学和技术计算的性能。

数组是非负整数索引,因此可以访问的最大数组大小将是Integer.MAX_VALUE。另一件事是你可以创建多大的数组。它取决于你的JVM可用的最大内存和数组的内容类型。例如,每个数组元素都有它的大小。__abc2, __abc3, __abc4

因此,如果你的机器上有1 MB可用内存,你可以分配一个byte[1024 * 1024]Object[256 * 1024]的数组。

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

总结 -理论上数组的最大大小将是Integer.MAX_VALUE。实际上,这取决于你的JVM有多少内存,以及有多少内存已经分配给了其他对象。

我试着创建一个这样的字节数组

byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);

使用这个运行配置:

-Xms4G -Xmx4G

及java版本:

Openjdk version "1.8.0_141"

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

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

它只适用于x >= 2,这意味着数组的最大大小是Integer。MAX_VALUE-2

高于此值

java.lang.OutOfMemoryError:请求的数组大小超过虚拟机限制 Main.main (Main.java: 6) < / p >

实际上,它是java限制在2^30-4的上限,即1073741820。不是2 ^还有。不知道为什么,但我在jdk上手动测试。2^30-3仍然抛出vm除外

编辑:固定-1到-4,检查windows jvm

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

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

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