Как Целочисленные массивы хранятся внутренне в JVM?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

5
задан izb 16 September 2008 в 20:23
поделиться

5 ответов

Никакой VM, о котором я знаю, не сохранит Целое число [] массив как интервал [] массив по следующим причинам:

  1. Могут быть пустые Целочисленные объекты в массиве, и у Вас нет битов, уехал в указание на это в международном массиве. VM мог хранить эту 1-разрядную информацию на ячейку массива в hiden битовом массиве все же.
  2. Можно синхронизироваться в элементах Целочисленного массива. Это намного более трудно преодолеть как первая точка, так как необходимо было бы хранить объект монитора для каждой ячейки массива.
  3. Элементы Целого числа [] могут быть сравнены для идентификационных данных. Вы могли, например, создать два Целочисленных объекта со значением 1 через новый и сохранить их в различных ячейках массива, и позже Вы получаете их и сравниваете их через ==. Это должно привести ко лжи, таким образом, необходимо было бы хранить эту информацию где-нибудь. Или Вы сохраняете ссылку на один из Целочисленных объектов где-нибудь и используете это для сравнения, и необходимо удостовериться один из ==, сравнения являются ложью и одним истинным. Это означает, что целое понятие объектных идентификационных данных тихо трудно для обработки для оптимизированного Целочисленного массива.
  4. Можно бросить Целое число [] к, например, Объект [] и передать его методам, ожидающим просто Объект []. Это означает весь код, который обрабатывает Объект [], должен теперь смочь обработать специальное Целое число [] объект также, делая это медленнее и больше.

Принимая все это во внимание, вероятно, было бы возможно сделать специальное Целое число [], который оставляет некоторое свободное место по сравнению с наивной реализацией, но дополнительная сложность будет, вероятно, влиять на большое количество другого кода, делая его медленнее в конце.

Издержки использования Целого числа [] вместо интервала [] могут быть тихи большой в пространстве и времени. На типичном VM на 32 бита Целочисленный объект использует 16 байтов (8 байтов для объектного заголовка, 4 для полезной нагрузки и 4 дополнительных байтов для выравнивания), в то время как Целое число [] использует столько же пространства сколько интервал []. В VMs на 64 бита (использующий указатели на 64 бита, который не всегда имеет место) Целочисленный объект использует 24 байта (16 для заголовка, 4 для полезной нагрузки и 4 для выравнивания). Кроме того, слот в Целом числе [] будет использовать 8 байтов вместо 4 как в интервале []. Это означает, что можно ожидать издержки 16 - 28 байтов за слот, которые являются фактором 4 - 7 по сравнению с простыми международными массивами.

Производительность наверху может быть значительной также по главным образом двум причинам:

  1. Так как Вы используете больше памяти, Вы ставите намного больше давления на подсистему памяти, делая ее более вероятно, чтобы иметь неудачные обращения в кэш в случае Целого числа []. Например, если Вы пересечете содержание интервала [] линейным способом, то кэш будет уже иметь большинство записей выбранным при необходимости в них (так как расположение линейно также). Но в случае Целочисленного массива, Целое число возражает себе, мог бы быть рассеян случайным образом в "куче", мешающей кэшу предположить, где следующая ссылка памяти укажет на.
  2. Сборка "мусора" должна сделать намного больше работы из-за дополнительной используемой памяти и потому что она должна просканировать и переместить каждый Целочисленный объект отдельно, в то время как в случае интервала [] это - всего один объект, и содержание объекта не должен быть просканирован (они не содержат ссылки на другие объекты).

Для подведения это, с помощью интервала [] в важной работе производительности будет и намного быстрее и память, эффективная, чем использование Целочисленного массива в текущем VMs, и маловероятно, что это изменится очень в ближайшем будущем.

12
ответ дан 18 December 2019 в 10:51
поделиться

John Rose, работающий над fixnums в JVM для решения эту проблему.

3
ответ дан 18 December 2019 в 10:51
поделиться

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

Тем не менее указатель фактического объекта будет к неизменному международному экземпляру, особенно для избранного подмножества целых чисел.

1
ответ дан 18 December 2019 в 10:51
поделиться

Это не будет намного медленнее, но потому что Целое число [] должно принять "пустой указатель" как запись, и интервал [] не имеет к, будет некоторая сумма включенной бухгалтерии, даже если Целое число [] будет поддержано интервалом [].

Таким образом, если каждая последняя унция вопросов производительности, пользовательский интервал []

0
ответ дан 18 December 2019 в 10:51
поделиться

Причина, что Целое число может быть пустым, тогда как интервал не может, состоит в том, потому что Целое число является законченным объектом Java со всеми издержками, которые включают. Существует значение в этом, так как можно записать

Integer foo = new Integer();
foo = null; 

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

Другое различие - это int не выполняет водосливного вычисления. Например,

int bar = Integer.MAX_VALUE;
bar++;

весело увеличит панель, и Вы заканчиваете с очень отрицательным числом, которое является, вероятно, не, что Вы предназначили во-первых.

foo = Integer.MAX_VALUE;
foo++;

будет жаловаться, который я думаю, было бы лучшее поведение.

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

0
ответ дан 18 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: