Что такое скрытая ссылка в заголовке объекта Java и для чего она используется?

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

Ответ

В заголовке каждого объекта в куче JVM хранится скрытая ссылка на его Class-объект (метаданные типа). Это внутренний механизм JVM для поддержки возможностей времени выполнения (Runtime).

Назначение этой ссылки:

  1. RTTI (Runtime Type Identification): Определение реального типа объекта во время выполнения.
    Object obj = new ArrayList<>();
    Class<?> actualClass = obj.getClass(); // Использует внутреннюю ссылку
    System.out.println(actualClass.getName()); // java.util.ArrayList
  2. Динамическое связывание (Dynamic Dispatch): Для вызова виртуальных методов JVM использует эту ссылку, чтобы найти правильную реализацию в таблице виртуальных методов (vtable) класса.
  3. Рефлексия: Все операции java.lang.reflect (получение методов, полей) работают через Class-объект.

Структура заголовка объекта (зависит от JVM, пример для HotSpot):

  • Mark Word: Хранит хэш-код объекта, данные для сборщика мусора, информацию о блокировке (для synchronized).
  • Klass Pointer: Та самая ссылка на метаданные класса (Class-объект).
  • Длина массива (только для массивов).

Практическое значение:

  • Накладные расходы: Каждый объект имеет overhead в 8-16 байт на заголовок.
  • instanceof и приведение типов выполняются через проверку этой ссылки.
  • При сериализации Class-объект не сериализуется, но его имя используется для поиска класса при десериализации.