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.