Что хранится в Object Header

У каждого объекта в java, помимо самих полей есть метаданные, которые называются object header. Давайте разберемся, что именно там хранится.

Структура object header:

  • klass pointer (4 байта на 32x, 8 байт на 64х)
  • mark word (4 байта на 32x, 8 байт на 64х) из которых:
    • identityHashCode (25 бит на 32x, 31 бит на 64х)
    • lock (2 бита всегда)
    • длина (только для массивов)

java-mark-word

  • Hashcode - хешкод объекта, вызывается лениво.
  • Age - число пережитых сборок мусора объектом 4 бита => максимум может достигать 15
  • Lock record address - указатель на монитор в java
  • Monitor address - указатель на монитор ОС
  • Forwarding address, etc - ?
  • Thread ID - id треда владеющего объектом. Используется при легкой (biased) блокировке.

Распределения по байтам для различных систем здесь

Описание состояний объекта:

  • Unlocked - новый объект, в нем зарезервировано 25 бит на identityHashcode. Блокировка на объекте не вызывалась. Но если на объекте позвали identity hashcode, забайсить (biased) на него больше никогда будет нельзя.
  • Biased - легкая блокировка на уровне Java, используется если с объектом работает один поток. В этом случае захват происходит без накладных расходов.
  • Light-weight lock (thin) - блокировка на уровне Java, использует CAS операции для гарантирования эксклюзивного доступа при небольшом контеншене.
  • Marked for GC - объект не используется, GC может удалить его.
  • Heavy-weight lock (fat/inflated lock) - блокировка на уровне ОС, используется мютекс операционной системы
Written on February 9, 2019