Сколько памяти занимает объект Integer в Java?

«Сколько памяти занимает объект Integer в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объект Integer занимает значительно больше памяти, чем примитив int, из-за накладных расходов JVM на хранение объекта.

Размер в памяти (для 64-битной JVM HotSpot с включенным сжатием ссылок - -XX:+UseCompressedOops, что используется по умолчанию):

  1. Заголовок объекта: 12 байт.
  2. Поле value типа int: 4 байта.
  3. Выравнивание (padding): 0 байт (итог кратен 8).

Итого: 16 байт на один объект Integer.

Сравнение:

int primitive = 42;          // Занимает ровно 4 байта.
Integer object = Integer.valueOf(42); // Занимает ~16 байт.

Практические последствия:

  • Использование ArrayList<Integer> вместо int[] приводит к значительному увеличению потребления памяти и снижению производительности из-за дополнительных аллокаций и промахов кэша.
  • Автоупаковка (int -> Integer) в циклах создает множество временных объектов, что может вызвать нагрузку на сборщик мусора.
  • Для хранения больших объемов целочисленных данных предпочтительнее использовать примитивные массивы (int[]) или специализированные коллекции (например, из библиотеки Eclipse Collections).