Java数组的最大大小

2023/06/09

1. 概述

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

2. 最大大小

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

对于我们的示例,我们在Linux和Windows机器上使用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和Windows机器,观察到类似的行为。在使用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)

结果显示最大大小为2147483645

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

3. ArraySupport

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

4. 总结

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

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章