Есть ли ограничение на количество элементов, которые может содержать массив 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