Какая максимальная длина массива в java
Перейти к содержимому

Какая максимальная длина массива в java

  • автор:

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

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

8 ответов

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

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

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

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

который добавляет Мартин Буххольц (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 пока не имеет реального использования.)

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

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

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

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

Массивы являются неотрицательными целыми индексами, поэтому максимальный размер массива, к которому вы можете получить доступ, будет 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 и сколько из них уже выделено для других объектов.

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

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

Версия Openjdk «1.8.0_141»

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

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

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

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

10 ответов

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

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

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

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

который добавлен Мартином Буххольцем (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 пока не имеет реального использования.)

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

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

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

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

Массивы индексируются неотрицательным целым числом, поэтому максимальный размер массива, к которому вы можете получить доступ, будет 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 и сколько из этого уже было выделено другим объектам.

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

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

Версия Openjdk «1.8.0_141»

Среда выполнения OpenJDK (сборка 1.8.0_141-b16)

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

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

Значения выше этого дают

Исключение в потоке «main» java.lang.OutOfMemoryError: Размер запрашиваемого массива превышает ограничение виртуальной машины в Main.main(Main.java:6)

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

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

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

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

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

Массив Java имеет ограничение, потому что это целочисленный массив, что означает, что он имеет до 2147483647 элементов в массиве

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

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

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

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

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

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

При выполнении вышеуказанной программы на машинах Linux и Mac наблюдается аналогичное поведение. При выполнении с аргументами виртуальной машины -Xms2G -Xmx2G мы получим следующие ошибки:

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

Теперь попробуем с аргументами ВМ -Xms9G -Xmx9G получить точный максимальный размер:

Результаты показывают, что максимальный размер составляет 2 147 483 645 .

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

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

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

4. Вывод​

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

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

Do Java arrays have a maximum size?

Is there a limit to the number of elements a Java array can contain? If so, what is it?

Pops's user avatar

10 Answers 10

. on MacOS, the answer seems to be Integer.MAX_VALUE — 2 . Once you go beyond that:

This is (of course) totally VM-dependent.

Browsing through the source code of OpenJDK 7 and 8 java.util.ArrayList , .Hashtable , .AbstractCollection , .PriorityQueue , and .Vector , you can see this claim being repeated:

which is added by Martin Buchholz (Google) on 2010-05-09; reviewed by Chris Hegarty (Oracle).

So, probably we can say that the maximum «safe» number would be 2 147 483 639 ( Integer.MAX_VALUE — 8 ) and «attempts to allocate larger arrays may result in OutOfMemoryError».

(Yes, Buchholz’s standalone claim does not include backing evidence, so this is a calculated appeal to authority. Even within OpenJDK itself, we can see code like return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; which shows that MAX_ARRAY_SIZE does not yet have a real use.)

Alexey Ivanov's user avatar

There are actually two limits. One, the maximum element indexable for the array and, two, the amount of memory available to your application. Depending on the amount of memory available and the amount used by other data structures, you may hit the memory limit before you reach the maximum addressable array element.

Java has been criticized for not supporting arrays of more than 2 31 −1 (about 2.1 billion) elements. This is a limitation of the language; the Java Language Specification, Section 10.4, states that:

Arrays must be indexed by int values. An attempt to access an array component with a long index value results in a compile-time error.

Supporting large arrays would also require changes to the JVM. This limitation manifests itself in areas such as collections being limited to 2 billion elements and the inability to memory map files larger than 2 GiB. Java also lacks true multidimensional arrays (contiguously allocated single blocks of memory accessed by a single indirection), which limits performance for scientific and technical computing.

Arrays are non-negative integer indexed , so maximum array size you can access would be Integer.MAX_VALUE . The other thing is how big array you can create. It depends on the maximum memory available to your JVM and the content type of the array. Each array element has it’s size, example. byte = 1 byte , int = 4 bytes , Object reference = 4 bytes (on a 32 bit system)

So if you have 1 MB memory available on your machine, you could allocate an array of byte[1024 * 1024] or Object[256 * 1024] .

Answering your question — You can allocate an array of size (maximum available memory / size of array item).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *