Какой объем памяти занимает экземпляр класса Object в Java?

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

Ответ

Размер пустого объекта new Object() в куче (heap) зависит от разрядности JVM и настроек.

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

  • Заголовок объекта: 12 байт.
    • Mark Word: 8 байт (хранит хэшкод, информацию о блокировке и сборке мусора).
    • Klass Pointer: 4 байта (сжатая ссылка на метаданные класса).
  • Выравнивание (padding): 4 байта (для кратности 8).
  • ИТОГО: 16 байт.

На 64-битной JVM без сжатия ссылок (-XX:-UseCompressedOops):

  • Заголовок объекта: 16 байт (8 байт Mark Word + 8 байт Klass Pointer).
  • Выравнивание: 0 байт (размер уже кратен 8).
  • ИТОГО: 16 байт.

Практическое измерение с помощью JOL (Java Object Layout):

// Добавь зависимость org.openjdk.jol:jol-core
import org.openjdk.jol.info.ClassLayout;

public class ObjectSize {
    public static void main(String[] args) {
        System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());
    }
}
// Вывод покажет точную структуру и размер.

Важно: Размер может незначительно варьироваться в разных JVM и зависит от состояния объекта (например, наличие блокировки).