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 639 ( Integer.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 byte
, int = 4 bytes
, Object 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)−1
或2 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限制