Перейти к основному содержимому

Какой максимальный размер массива в Java?

· 2 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим максимальный размер массива в Java.

2. Максимальный размер

Программа Java может выделять массив только до определенного размера. Обычно это зависит от используемой JVM и платформы. Поскольку индекс массива — int, приблизительное значение индекса может быть 2^31 — 1. Исходя из этого приближения, мы можем сказать, что массив теоретически может содержать 2 147 483 647 элементов .

В нашем примере мы используем реализации OpenJDK и Oracle для Java 8 и Java 15 на компьютерах Linux и Mac. Результаты были одинаковыми на протяжении всего нашего тестирования.

В этом можно убедиться на простом примере:

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 наблюдается аналогичное поведение. При выполнении с аргументами виртуальной машины -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

Обратите внимание, что первая ошибка отличается от двух последних. Последние две ошибки связаны с ограничением виртуальной машины, а первая связана с ограничением памяти в куче .

Теперь попробуем с аргументами ВМ -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 .

Такое же поведение можно наблюдать для byte , boolean , long и других типов данных в массиве, и результаты будут такими же.

3. Поддержка массивов

ArraysSupport — это служебный класс в OpenJDK, который предлагает максимальный размер Integer.MAX_VALUE — 8 , чтобы он работал со всеми версиями и реализациями JDK .

4. Вывод

В этой статье мы рассмотрели максимальный размер массива в Java.

Как обычно, все примеры кода, используемые в этом руководстве, доступны на GitHub.