Ответ 1
Для HotSpot:
Заголовок объекта состоит из знака и указателя klass.
Знак имеет размер слова (4 byte
на 32-битных архитектурах, 8 byte
на 64-битных архитектурах) и
указатель klass имеет размер слова на архитектуре 32 bit
. В архитектуре 64 bit
указатель klass имеет либо размер слова, но также может иметь 4 byte
, если адреса кучи могут быть закодированы в этих 4 bytes
.
Эта оптимизация называется "сжатым oops" , и вы также можете управлять ею с помощью опции UseCompressedOops
.
Вы также можете найти запись в вики об этом 1.
Значок действительно используется для многих вещей.
- Один
Biased Locking
2, через который HotSpot может реализовать эффективную блокировку. - Он также используется во время
GC to set forward pointers
иto store the age of the objects
. Хэш-код идентичности объекта может храниться внутри метки (System.identityHashCode
/Object.hashCode
).
В исходном коде markOop.hpp есть комментарий, который описывает макет в зависимости от архитектуры:
// 32 bits:
// --------
// hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object)
// size:32 ------------------------------------------>| (CMS free block)
// PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
// 64 bits:
// --------
// unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
// PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
// size:64 ----------------------------------------------------->| (CMS free block)
//
// unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)
// JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
// narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
// unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
Вы также можете найти заголовочный файл oop здесь.