Java数组是否具有最大大小?

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

没有看到正确的答案,尽pipe它很容易testing。

在最近的HotSpot VM中,正确的答案是Integer.MAX_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的java.util.ArrayList.Hashtable.AbstractCollection.PriorityQueue.Vector的源代码,你可以看到这个声明被重复:

 /** * 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(Google) 于2010-05-09添加 ; 由Chris Hegarty(Oracle)审核。

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

(是的,Buchholz的独立声明不包括支持证据,所以这是对权威的一种计算吸引力,即使在OpenJDK本身,我们也可以看到像return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;这表明MAX_ARRAY_SIZE不但有真正的用途。)

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

通过这篇文章http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays

Java被批评为不支持超过2 31 -1(约21亿)元素的数组。 这是语言的限制; Java语言规范第10.4节指出:

数组必须通过int值进行索引…尝试访问具有长索引值的数组组件时,会导致编译时错误。

支持大型数组也需要对JVM进行更改。 这种局限性performance在集合被限制在20亿个元素以及无法存储大于2 GiB的地图文件等领域。 Java也缺乏真正的multidimensional array(连续分配单个间接访问的单个内存块),这限制了科学和技术计算的性能。

数组是非负整数索引,所以您可以访问的最大数组大小将是Integer.MAX_VALUE 。 另一件事是你可以创build多大的数组。 这取决于可用于JVM的最大内存和arrays的内容types。 每个数组元素都有它的大小,例如。 byte = 1 byteint = 4 bytesObject reference = 4 bytes (on a 32 bit system)

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

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

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

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

我试图创build一个这样的字节数组

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

有了这个运行configuration:

 -Xms4G -Xmx4G 

和java版本:

Openjdk版本“1.8.0_141”

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

OpenJDK 64位服务器虚拟机(构build25.141-b16,混合模式)

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

高于给出的值

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