Является ли массив из одного логического значения в Java меньше, чем автономная переменная? - PullRequest
5 голосов
/ 22 января 2012

Мои поиски на SO не дали мне результата, поэтому, если это дубликат, пожалуйста, перенаправьте меня.

С этим, кстати, мой вопрос: из опыта и просмотра SO я узнал, что Java boolean сохраняется как 32-битный int, если вы объявляете его как отдельное значение, но как 8-битный byte, если вы объявляете его в массиве.Мой вопрос здесь следующий: Что более эффективно для памяти?Метаданные массива делают его больше в памяти, чем альтернатива?

boolean oneVariable = false, oneArray[] = {false};

Ответы [ 4 ]

7 голосов
/ 22 января 2012

Массив является реальным объектом, который идет со штрафом памяти (я думаю, 12 байт). Таким образом, примитивный логический тип меньше.

4 голосов
/ 22 января 2012

«Метаданные» массива включают в себя:

  • 8 байтов (32-битная JVM) или 16 байтов (64-битная JVM) для заголовка объекта
  • 4 байта(32 бита) для длины массива

Добавьте 1 необходимый байт для логических данных, и вы получите минимум 13 байт (32 бита) или 21 байт (64 бита).

Однако объектам выделяется память в виде 8-байтовых кратных значений, поэтому даже если вам нужно только 12 или 20 байтов служебной информации + 1 байт для логического значения, вам придется использовать 16 или 24 байта памяти соответственно., для вашего объекта массива.

В дополнение к 16/24 байтам сам объект будет занимать, вам потребуется 4 байта (32 бита) или 8 байтов (64 бита) для адреса памятиобъект, занимающий 20 или 32 байта памяти соответственно для хранения вашего логического значения в массиве.

Размер автономной переменной зависит от JVM.Java не определяет размер хранилища, и на самом деле Oracle говорит

Этот тип данных представляет один бит информации, но его "размер" не является чем-то точно определенным.

Старые JVM используют 32-разрядную ячейку стека, используемую для хранения локальных переменных, аргументов метода и значений выражений, поэтому один логический тип, используемый в качестве переменной, будет занимать 4 байта;сделать массив как минимум в 5 раз дороже, чем для одного логического.Этот ответ может быть другим, если, например, логическое значение является переменной класса, и в этом случае это будет просто один байт, добавленный к существующим издержкам.В более новых JVM один логический тип будет использовать только 1 байт, но в зависимости от контекста и 8-байтового заполнения, необходимого для выравнивания адресов памяти, он все равно может занимать до 8 байт пространства кучи.Он все равно будет меньше, чем логический массив.

1 голос
/ 22 января 2012

Эта статья специалиста по Java является хорошим источником для понимания использования памяти .

0 голосов
/ 22 января 2012

Как упоминалось user949300 , все объекты несут штраф, делающий их больше, чем примитивы.Только для одного логического значения память не имеет значения.Если вы храните большое количество логических значений, рассмотрите возможность использования BitSet .Я считаю, что под капотом он использует примерно 1 бит на логическое значение (плюс некоторые накладные расходы).

...