Сколько памяти занимает объект Integer в 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).

Ответ 18+ 🔞

Ну ты смотри, какая дичь! Взяли обычный int, который всего-то четыре байта занимает, и завернули его в красивую обёртку Integer. А под капотом-то, блядь, целый цирк начинается!

На 64-битной JVM, если сжатие ссылок включено (а оно обычно так и есть), один такой объектик-обманщик жрёт аж 16 байт! Как так-то?

Да вот так, ёпта:

  1. Заголовок объекта — 12 байт. Это как паспорт и инструкция по применению, без них никуда.
  2. Само значение, то бишь value — 4 байта. Ну, то, ради чего всё и затевалось.
  3. Выравнивание — в этот раз ноль, потому что 12+4=16, и так уже красиво.

И что в сухом остатке? Полная хуита по потреблению памяти!

int primitive = 42;          // Чистый, как слеза младенца. 4 байта и ни грамма жира.
Integer object = Integer.valueOf(42); // Распухший бюрократ. Тянет на целых 16 байт, сука!

А теперь представь, что ты вместо нормального массива int[] юзаешь ArrayList<Integer>. Это ж пиздец, Карл! Каждая циферка — это отдельный объект, со своим заголовком, со своей жизнью. Память летит в трубу, кэш процессора плачет кровавыми слезами от таких промахов, а сборщик мусора уже точит ножи — скоро ему предстоит адская работа по уборке этого бардака.

Особенно весело, когда автоупаковка в циклах начинает плодить эти объекты, как сумасшедшая. Цикл прокрутился — сотня новых Integer на свалке. Красота!

Вывод, блядь, простой: если работаешь с кучей чисел и хочешь, чтобы всё летало, а не ползало — бери примитивные массивы (int[]). Ну или ищи спецколлекции, которые с примитивами умеют работать, те же Eclipse Collections. А эти Integer в массовых количествах — верная дорога к перформанс-пиздецу.