Что хранится в 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 бита всегда)
- длина (только для массивов)
- 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