Java对象头
2022年6月21日大约 2 分钟
对象头描述
Java对象如果是数组类型,则虚拟机用3个字宽存储对象头;若是非数组类型,则用2个字宽存储对象头。在32位虚拟机中,1字宽等于4字节32bit;64位虚拟机中1字宽等于8字节64bit
Java对象头存储内容
长度 | 内容 | 说明 |
---|---|---|
32/64bit | Mark Word | 存储对象的HashCode、分代年龄和锁信息等 |
32/64bit | Class Meta Address | 存储指向对象类型数据的指针 |
32/64bit | Array Length | 数组的长度(仅仅对象是数组类型) |
Java对象头Mark Word
存储内容(32位)
锁状态 | 25bit | 4bit | 1bit 是否是偏向锁 | 2bit 锁标志位 |
---|---|---|---|---|
无锁状态 | 对象的HashCode | 对象的分代年龄 | 0 | 01 |
存储内容(64位)
锁状态 | 25bit | 31bit | 1bit | 4bit | 1bit | 2bit |
cms_free | 分代年龄 | 偏向锁 | 锁标志位 | |||
无锁 | unused | HashCode | 0 | 01 | ||
偏向锁 | ThreadID(54bit) Epoch(2bit) | 1 | 01 |
状态变化
锁状态 | 25bit | 4bit | 1bit | 2bit | |
23bit | 2bit | 是否是偏向锁 | 锁标志位 | ||
轻量级锁 | 指向栈中锁记录的指针 | 00 | |||
重量级锁 | 指向互斥量(重量级锁)的指针 | 10 | |||
GC 标记 | 空 | 11 | |||
偏向锁 | 线程ID | Epoch | 对象分代年龄 | 1 | 01 |
原创声明
平台文章均为原创文章,未经许可,禁止转载。
如需转载,请联系作者获取授权,并注明来源及原文链接。