Вопрос-ответ

Do Java arrays have a maximum size?

Имеют ли массивы Java максимальный размер?

Существует ли ограничение на количество элементов, которые может содержать массив Java? Если да, то какое?

Переведено автоматически
Ответ 1

Использование

OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)

... в macOS ответ, похоже, будет Integer.MAX_VALUE - 2. Как только вы выйдете за рамки этого:

cat > Foo.java << "END"
public class Foo {
public static void main(String[] args) {
boolean[] array = new boolean[Integer.MAX_VALUE - 1]; // too big
}
}
END
java -Xmx4g Foo.java

... вы получаете:

Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
Ответ 2

Это (конечно) полностью зависит от виртуальной машины.

Просматривая исходный код OpenJDK 7 и 8 java.util.ArrayList, .Hashtable, .AbstractCollection .PriorityQueue, .Vector и , вы можете увидеть, что это утверждение,, повторяется:


/**
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

добавлено Мартином Бухгольцем (Google) в 2010-05-09; проверено Крисом Хегарти (Oracle).

Итак, вероятно, мы можем сказать, что максимальное "безопасное" число будет 2 147 483 639 (Integer.MAX_VALUE - 8) и "попытки выделить массивы большего размера могут привести к OutOfMemoryError".

(Да, отдельное утверждение Бухгольца не включает подтверждающих доказательств, так что это рассчитанная апелляция к авторитету. Даже в самом OpenJDK мы можем видеть код, подобный return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; который показывает, что MAX_ARRAY_SIZE он еще не используется по-настоящему.)

Ответ 3

На самом деле существует два ограничения. Первое - максимальный элемент, индексируемый для массива, и, во-вторых, объем памяти, доступный вашему приложению. В зависимости от объема доступной памяти и объема, используемого другими структурами данных, вы можете превысить лимит памяти до того, как достигнете максимального адресуемого элемента массива.

Ответ 4

Следуя этой статье http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays:


Java подвергалась критике за то, что не поддерживает массивы более чем из 231-1 (около 2,1 миллиарда) элементов. Это ограничение языка; в спецификации языка Java, раздел 10.4, говорится, что:



Массивы должны индексироваться значениями int... Попытка получить доступ к компоненту массива с длинным значением индекса приводит к ошибке времени компиляции.



Поддержка больших массивов также потребовала бы изменений в JVM. Это ограничение проявляется в таких областях, как коллекции, ограниченные 2 миллиардами элементов, и невозможность отображать в памяти файлы размером более 2 Гигабайт. В Java также отсутствуют настоящие многомерные массивы (последовательно выделенные отдельные блоки памяти, доступ к которым осуществляется одним косвенным способом), что ограничивает производительность научных и технических вычислений.

java arrays