For HotSpot:
The object header consists of a mark word and a klass pointer.
The mark word has word size (4 byte
on 32 bit architectures, 8 byte
on 64 bit architectures) and
the klass pointer has word size on 32 bit
architectures. On 64 bit
architectures the klass pointer either has word size, but can also have 4 byte
if the heap addresses can be encoded in these 4 bytes
.
This optimization is called "compressed oops" and you can also control it with the option UseCompressedOops
.
You can also find a wiki entry about this 1.
The mark word is actually used for many things.
- One is
Biased Locking
2 through which HotSpot can implement efficient locking.
- It is also used during
GC to set forward pointers
, and to store the age of the objects
. The identity hash code of an object can be stored inside the mark (the System.identityHashCode
/Object.hashCode
one).
There is a comment in the source code of markOop.hpp that describes the layout depending on the architecture:
// 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)
You can also find the oop header file here.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…