Maximum Size of Java Arrays – Java数组的最大尺寸

最后修改: 2021年 5月 28日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this tutorial, we’ll look at the maximum size of an array in Java.

在本教程中,我们将研究Java中数组的最大尺寸。

2. Max Size

2.最大尺寸

A Java program can only allocate an array up to a certain size. It generally depends on the JVM that we’re using and the platform. Since the index of the array is int, the approximate index value can be 2^31 – 1. Based on this approximation, we can say that the array can theoretically hold 2,147,483,647 elements.

一个Java程序只能分配到一定大小的数组。这一般取决于我们所使用的JVM和平台。由于数组的索引是int,近似的索引值可以是2^31 – 1。基于这个近似值,我们可以说,该数组理论上可以容纳2,147,483,647个元素

For our example, we’re using the OpenJDK and Oracle implementations of Java 8 and Java 15 on Linux and Mac machines. The results were the same throughout our testing.

在我们的示例中,我们在 Linux 和 Mac 机器上使用 OpenJDKOracle 实现的 Java 8 和 Java 15。在我们的整个测试过程中,结果都是一样的。

This can be verified using a simple example:

这可以通过一个简单的例子来验证。

for (int i = 2; i >= 0; i--) {
    try {
        int[] arr = new int[Integer.MAX_VALUE - i];
        System.out.println("Max-Size : " + arr.length);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

During the execution of the above program, using Linux and Mac machines, similar behavior is observed. On execution with VM arguments -Xms2G -Xmx2G, we’ll receive the following errors:

在执行上述程序的过程中,使用Linux和Mac机器,观察到类似的行为。在使用VM参数-Xms2G -Xmx2G执行时,我们会收到以下错误。

java.lang.OutOfMemoryError: Java heap space
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit

Note that the first error is different from the last two. The last two errors mention the VM limitation, whereas the first one is about heap memory limitation.

请注意,第一个错误与后两个不同。最后一个 两个错误提到了虚拟机的限制,而第一个则是关于堆内存的限制

Now let’s try with the VM arguments -Xms9G -Xmx9G to receive the exact maximum size:

现在让我们用VM参数-Xms9G -Xmx9G 来尝试接收准确的最大尺寸。

Max-Size: 2147483645
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.example.demo.ArraySizeCheck.main(ArraySizeCheck.java:8)

The results show the maximum size is 2,147,483,645.

结果显示,最大的规模是2,147,483,645

The same behavior can be observed for byte, boolean, long, and other data types in the array, and the results are the same.

对于bytebooleanlong和数组中的其他数据类型,可以观察到同样的行为,结果是一样的。

3. ArraySupport

3.ArraySupport(阵列支持)

ArraysSupport is a utility class in OpenJDK, which suggests having the maximum size as Integer.MAX_VALUE – 8 to make it work with all the JDK versions and implementations.

ArraysSupport是OpenJDK中的一个实用类,它建议将最大尺寸as Integer.MAX_VALUE – 8 以使其适用于所有JDK版本和实现

4. Conclusion

4.总结

In this article, we looked at the maximum size of an array in Java.

在这篇文章中,我们研究了Java中数组的最大尺寸。

As usual, all code samples used in this tutorial are available over on GitHub.

像往常一样,本教程中使用的所有代码样本都可以在GitHub上找到