1. 概述

在本教程中,我们将了解 Java 中数组的最大大小。

2. 最大尺寸

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

对于我们的示例, 我们在 Linux 和 Mac 计算机上使用 Java 8 和 Java 15 的OpenJDKOracle实现 。我们整个测试的结果都是一样的。

这可以使用一个简单的例子来验证:

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();
    }
}

在使用 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

请注意,第一个错误与后两个错误不同。 最后 两个错误提到了 VM 限制,而第一个错误则涉及堆内存限制

现在让我们尝试使用 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)

结果显示 最大大小为 2,147,483,645

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

3. 数组支持

ArraysSupport 是 OpenJDK 中的一个实用程序类,建议将 最大大小 设置为 Integer.MAX_VALUE – 8 ,以使其适用于 所有 JDK 版本和实现

4。结论

在本文中,我们研究了 Java 中数组的最大大小。

与往常一样,本教程中使用的所有代码示例都可以在 GitHub 上获取。