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

时间:2010-06-14 15:16:31

标签: java arrays

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

10 个答案:

答案 0 :(得分:169)

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

在最近的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

答案 1 :(得分:118)

这(当然)完全取决于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(谷歌)on 2010-05-09添加;由Chris Hegarty(Oracle)审核。

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

(是的,Buchholz的独立声明不包括支持证据,因此这是一个计算appeal to authority.即使在OpenJDK本身,我们也可以看到像return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;这样的代码,表明MAX_ARRAY_SIZE没有但是真正的使用。)

答案 2 :(得分:38)

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

答案 3 :(得分:26)

完成本文http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays

  

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

     
    

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

  

支持大型数组也需要更改JVM。此限制表现在诸如集合限制为20亿个元素以及无法存储大于2 GiB的映射文件的区域中。 Java还缺少真正的多维数组(连续分配单个内存访问的单个内存块),这限制了科学和技术计算的性能。

答案 4 :(得分:10)

数组是非负整数索引,因此您可以访问的最大数组大小为Integer.MAX_VALUE。另一件事是你可以创建多大的数组。它取决于JVM可用的最大内存和阵列的内容类型。例如,每个数组元素都有它的大小。 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有多少内存以及已经分配给其他对象的内存量。

答案 5 :(得分:3)

我试图像这样创建一个字节数组

NumOfClicks

使用此运行配置:

domain

和java版本:

  

Openjdk版本" 1.8.0_141"

     

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

     

OpenJDK 64位服务器VM(版本25.141-b16,混合模式)

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

上面给出的值

  

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

实际上,这是Java的限制,将其上限限制为2 ^ 30-4,即1073741820。而不是2 ^ 31-1。 Dunno为什么但是我在jdk上手动测试了它。 2^30-3 still throwing vm except

编辑:固定为-1至-4,已在Windows jvm上选中

答案 9 :(得分:0)

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