Подтвердить что ты не робот

Integer vs int: относительно памяти

Мне было интересно, есть ли разница в памяти, занимаемой Integer n и int n.

Я знаю, что int n занимает обычно 4 байта, как насчет Integer n

4b9b3361

Ответ 1

В общем случае память кучи, используемая объектом Java в Hotspot, состоит из:

  • заголовок объекта, состоящий из нескольких байтов "служебной" информации;
  • для примитивных полей в соответствии с их размером (int n- > 32 бит)
  • для опорных полей (по 4 байта) (целое число n → 32 бита)
  • padding: возможно, несколько "потерянных" неиспользуемых байтов после данных объекта, чтобы каждый объект начинался с адреса, который является удобным кратным байтам и уменьшает количество бит, необходимых для представления указателя на объект.

согласно предложению Марка Петерса, я хотел бы добавить ссылку ниже http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

Ответ 2

Объект Integer в Java занимает 16 байтов.

Я не знаю, имеет ли значение 64- и 32-битная JVM. Для примитивных типов это не имеет значения. Но я не могу с уверенностью сказать, как объем памяти объекта изменяется (если вообще изменяется) в битовой системе 64-.

Вы можете проверить это здесь:

Java Совет 130: знаете ли вы свой размер данных?

Ответ 3

Для int: 4 байта, используемых для каждого элемента без оберток, и 16 на элемент с оберткой.

Обернутые двойные отчеты как 24 байта на элемент, с фактическим двойным значением как 64 бита (8 байтов).

Подробнее здесь

Ответ 4

int - это простой тип данных, для хранения которого требуется 32 бита (4 байта).

Когда ваш код Java использует оператор new для создания экземпляра объекта Java, гораздо больше данные распределены, чем вы могли ожидать. Например, вас может удивить то, что отношение размеров значения int к объекту Integer - наименьшему объекту, который может содержать значение int - обычно 1: 4.

Целое число - это объект, для хранения которого требуется 128 бит (16 байт).

Когда мы создаем новое целое число, используя новый оператор, он распределяет память следующим образом.

  1. Класс Object (32 бита) - состоит из указателя на информацию о классе, которая в нашем случае описывает объект с указанием на класс java.lang.Integer

  2. Флаги (32 бита) - это набор флагов, который описывает состояние объекта. Например, есть ли у него хэш-код, массив или нет, т.е. его форма.

  3. Lock (32 бита) - хранит информацию о синхронизации объекта. синхронизирован ли объект в настоящее время или нет.

Выше 3 точек называются метаданными объекта.

  1. Наконец, за метаданными следует сам объект data (32 бита). В случае Integer его единственное значение типа int.

Все вышеприведенное объяснение относится к 32-битной архитектуре процессора. Он может отличаться от версии JVM и поставщика.

Ответ 5

По крайней мере, можно подтвердить, что все Integer от -127 to +127 кэшируются. Если они созданы с использованием autoboxing ar Integer#valueOf(value), то не потребуется дополнительная память.

Для a Integer требуется только 32 bit.

value - единственная переменная-член, которая принимает память. Поэтому для хранения объекта потребуется размер целого числа, исключая дополнительную память.

public final class Integer extends Number implements Comparable<Integer> {
    ...
    private final int value;
    ...
}