一、对象的内存布局
HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:
- 对象头(Header)->3字宽
- Mark Word :存储对象的hashcode或锁信息(1字宽)
- Class Metadata Address:类型指针(1字宽):
即是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 - Array Length:数组长度(1字宽):如果当前对象是数组
实例数据(Instance Data)
对象真正存储的有效信息对齐填充(Padding)
JVM要求对象的大小必须是8字节的整数倍,对象头已经满足,则当对象的实例数据部分没有对齐时,需要对齐填充来补全。
Synchronized用的锁是存在java对象头里面的。
如果对象是数组结构,则虚拟机用3个字宽存储对象头。
如果对象是非数组结构,则虚拟机用2个字宽存储对象头。
32位虚拟机中,1字宽=4字节=32bit
32位JVM的Mark Word默认存储结构如下:(32bit)
在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化,可能会变化为以上4种数据。
https://blog.csdn.net/zhoufanyang_china/article/details/54601311