Вопрос проверяет понимание внутреннего устройства объектов в JVM и служебной информации, которая хранится вместе с данными.
В объекте в куче хранятся не только его поля.
Каждый объект содержит заголовок.
В заголовке хранится информация для синхронизации, GC и идентификации класса.
Эти данные нужны JVM для управления жизненным циклом объекта.
Без них объект не может корректно существовать.
Чтобы понять, что хранится в объекте, важно разделить пользовательские данные и служебные данные JVM.
Определение:
Заголовок объекта — это служебная область памяти, используемая JVM для управления объектом.
В заголовок обычно входят:
В этой части хранятся:
Состояние блокировки (synchronized).
Хеш-код объекта.
Информация для сборщика мусора.
Флаги состояния объекта.
Размер:
зависит от JVM
обычно 8 байт на 64-bit JVM
Ссылка на метаданные класса:
Описывает тип объекта.
Используется для вызова методов.
Нужна для instanceof и рефлексии.
Размер:
4 или 8 байт (с учетом Compressed Oops)
В зависимости от JVM могут добавляться:
Padding для выравнивания.
Служебные биты для оптимизаций.
Важно понимать, что:
Методы не хранятся в объекте.
Статические поля принадлежат классу, а не объекту.
Помимо своих полей объект в куче содержит заголовок с данными для синхронизации, GC и определения типа, без которых JVM не может управлять объектом.