Являются ли массивы Java максимальным?

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

Ответ 1

Не видел правильного ответа, хотя это очень легко проверить.

В недавней виртуальной машине HotSpot правильный ответ Integer.MAX_VALUE - 5. Как только вы выйдете за рамки этого:

public class Foo {
  public static void main(String[] args) {
    Object[] array = new Object[Integer.MAX_VALUE - 4];
  }
}

Вы получаете:

Exception in thread "main" java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit

Ответ 2

Это (конечно) полностью зависящее от VM.

Просмотр исходного кода 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 критиковалась за то, что не поддерживает массивы из более чем 2 31 -1 (около 2,1 миллиарда) элементов. Это ограничение языка; Спецификация языка Java, раздел 10.4, гласит, что:

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

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

Ответ 5

Массивы являются неотрицательными целыми индексами, поэтому максимальный размер массива, к которому вы можете получить доступ, будет Integer.MAX_VALUE. Другое дело, как большой массив вы можете создать. Это зависит от максимальной памяти, доступной для вашего JVM и типа содержимого массива. Например, каждый элемент массива имеет размер. byte = 1 byte, int = 4 bytes, Object reference = 4 bytes (on a 32 bit system)

Итак, если на вашем компьютере имеется память 1 MB, вы можете выделить массив byte[1024 * 1024] или Object[256 * 1024].

Ответ на ваш вопрос. Вы можете выделить массив размера (максимальная доступная память/размер элемента массива).

Сводка. Теоретически максимальный размер массива будет Integer.MAX_VALUE. Практически это зависит от того, сколько памяти имеет ваш JVM и сколько из них уже выделено для других объектов.

Ответ 6

Я попытался создать массив байтов, подобный этому

byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);

С этой конфигурацией запуска:

-Xms4G -Xmx4G

И версия java:

Версия Openjdk "1.8.0_141"

Рабочая среда OpenJDK (версия 1.8.0_141-b16)

64-разрядная виртуальная машина OpenJDK (построение 25.141-b16, смешанный режим)

Он работает только для x >= 2, что означает, что максимальный размер массива Integer.MAX_VALUE-2

Значения выше, которые дают

Исключение в потоке "main" java.lang.OutOfMemoryError: размер запрашиваемого массива превышает предел VM     на Main.main(Main.java:6)

Ответ 7

Максимальное количество элементов array равно (2^31)−1 или 2 147 483 647

Ответ 8

Да, есть ограничение на массив Java. Java использует целое число в качестве индекса для массива, а максимальное целочисленное хранилище для JVM составляет 2 ^ 32. так что вы можете хранить 2 147 483 647 элементов в массиве.

Если вам нужно больше, чем max-length, вы можете использовать два разных массива, но рекомендуемый метод - сохранить данные в файл. потому что хранение данных в файле не имеет ограничений. потому что файлы хранятся в ваших драйверах хранения, но массив хранятся в JVM. JVM предоставляет ограниченное пространство для выполнения программы.

Ответ 9

На самом деле это ограничение Java, ограничивающее 2 ^ 30 -4, равное 1073741820. Не 2 ^ 31 -1. Не знаю почему, но я проверил это вручную на JDK. 2 ^ 30-3 до сих пор бросает вм, кроме

Редактировать: исправлено -1 в -4, проверено на windows jvm