Java数组可以包含的元素数量是否有限制?如果是这样,那是什么?
Java数组可以包含的元素数量是否有限制?如果是这样,那是什么?
Answers:
即使测试很容易,也没有找到正确的答案。
在最新的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
MAX_VALUE-2
元素。这与我分配的内容无关,我真的很想知道VM可以使用这两个“东西”(长度不适合2个字节)。
Integer.MAX_VALUE+1
,您将有一个整数溢出。Java中的数组大小int
不是long
;无论您在数组,字节或引用中存储哪种数据类型。字符串只是对象引用。
Integer.MAX_VALUE - 2
= 2 147 483645。如果使用来运行Java,则Java将成功分配该数组-Xmx13G
。OutOfMemoryError: Java heap space
如果通过则失败-Xmx12G
。
(当然)这完全取决于VM。
通过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
尚未真正使用。)
-8
?
-8
是因为保留的标头字会占用字节。
阅读本文http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:
Java被批评为不支持超过2 31 -1(约21亿)个元素的数组。这是语言的限制;Java语言规范的第10.4节指出:
数组必须由int值索引...尝试访问具有长索引值的数组组件会导致编译时错误。
支持大型阵列还需要更改JVM。这种限制在诸如集合限制为20亿个元素以及无法存储大于2 GiB的内存映射文件之类的区域中体现出来。Java还缺少真正的多维数组(由单个间接访问连续分配的单个内存块),这限制了科学和技术计算的性能。
数组是非负整数索引,因此您可以访问的最大数组大小为Integer.MAX_VALUE
。另一件事是您可以创建多大的数组。这取决于您可用的最大内存JVM
和阵列的内容类型。每个数组元素都有其大小,例如。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
量以及已经分配给其他对象的内存量。
我试图创建一个像这样的字节数组
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
使用此运行配置:
-Xms4G -Xmx4G
和java版本:
Openjdk版本“ 1.8.0_141”
OpenJDK运行时环境(内部版本1.8.0_141-b16)
OpenJDK 64位服务器VM(内部版本25.141-b16,混合模式)
它仅适用于x> = 2,这意味着数组的最大大小为Integer.MAX_VALUE-2
高于该值的值
线程“主”中的异常java.lang.OutOfMemoryError:请求的数组大小超出了Main.main的VM限制(Main.java:6)
是的,对Java数组有限制。Java使用整数作为数组的索引,JVM的最大整数存储为2 ^ 32。因此您可以在数组中存储2,147,483,647个元素。
如果您需要的长度超过最大长度,则可以使用两个不同的数组,但是建议的方法是将数据存储到文件中。因为在文件中存储数据没有限制。因为存储在存储驱动程序中但数组存储的文件存储在JVM中。JVM为程序执行提供了有限的空间。
array
is (2^31)−1
或的最大元素数2 147 483 647
Integer.MAX_VALUE - 1
,您将收到“ java.lang.OutOfMemoryError:请求的数组大小超出VM限制”。JDK 6及更高版本中的最大元素数Integer.MAX_VALUE - 2
=2147483645。–
实际上,它是java的上限,上限为2 ^ 30-4,即1073741820。不是2 ^ 31-1。Dunno为什么但是我在jdk上手动测试了它。2 ^ 30-3仍然抛出vm
编辑:固定-1至-4,在Windows jvm上检查