由於Java面向對象的思想,在JVM中需要大量存儲對象,存儲時為了實現一些額外的功能,需要在對象中添加一些標記字段用於增強對象功能,這些標記字段組成了對象頭。
1.對象頭形式
JVM中對象頭的方式有以下兩種(以32位JVM為例):
1.1.普通對象
|--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark Word (32 bits) | Klass Word (32 bits) | |------------------------------------|-------------------------|
1.2.數組對象
|---------------------------------------------------------------------------------| | Object Header (96 bits) | |--------------------------------|-----------------------|------------------------| | Mark Word(32bits) | Klass Word(32bits) | array length(32bits) | |--------------------------------|-----------------------|------------------------|
2.對象頭的組成
2.1.Mark Word
這部分主要用來存儲對象自身的運行時數據,如hashcode、gc分代年齡等。mark word
的位長度為JVM的一個Word大小,也就是說32位JVM的Mark word
為32位,64位JVM為64位。
為了讓一個字大小存儲更多的信息,JVM將字的最低兩個位設置為標記位,不同標記位下的Mark Word示意如下:
|-------------------------------------------------------|--------------------| | Mark Word (32 bits) | State | |-------------------------------------------------------|--------------------| | identity_hashcode:25 | age:4 | biased_lock:1 | lock:2 | Normal | |-------------------------------------------------------|--------------------| | thread:23 | epoch:2 | age:4 | biased_lock:1 | lock:2 | Biased | |-------------------------------------------------------|--------------------| | ptr_to_lock_record:30 | lock:2 | Lightweight Locked | |-------------------------------------------------------