/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ privatestaticfinalintMAX_ARRAY_SIZE= Integer.MAX_VALUE - 8;
добавлено Мартином Бухгольцем (Google) в 2010-05-09; проверено Крисом Хегарти (Oracle).
Итак, вероятно, мы можем сказать, что максимальное "безопасное" число будет 2 147 483 639 (Integer.MAX_VALUE - 8) и "попытки выделить массивы большего размера могут привести к OutOfMemoryError".
На самом деле существует два ограничения. Первое - максимальный элемент, индексируемый для массива, и, во-вторых, объем памяти, доступный вашему приложению. В зависимости от объема доступной памяти и объема, используемого другими структурами данных, вы можете превысить лимит памяти до того, как достигнете максимального адресуемого элемента массива.
Java подвергалась критике за то, что не поддерживает массивы более чем из 231-1 (около 2,1 миллиарда) элементов. Это ограничение языка; в спецификации языка Java, раздел 10.4, говорится, что:
Массивы должны индексироваться значениями int... Попытка получить доступ к компоненту массива с длинным значением индекса приводит к ошибке времени компиляции.
Поддержка больших массивов также потребовала бы изменений в JVM. Это ограничение проявляется в таких областях, как коллекции, ограниченные 2 миллиардами элементов, и невозможность отображать в памяти файлы размером более 2 Гигабайт. В Java также отсутствуют настоящие многомерные массивы (последовательно выделенные отдельные блоки памяти, доступ к которым осуществляется одним косвенным способом), что ограничивает производительность научных и технических вычислений.