在 JVM 中,对象在内存中分为三块区域:
-
对象头:由
Mark Word
和Klass Point
构成。-
Mark Word(标记字段):用于存储对象自身的运行时数据,例如存储对象的HashCode,分代年龄、锁标志位等信息,是synchronized实现轻量级锁和偏向锁的关键。64位JVM的Mark Word组成如下:
偏向锁前56位线程ID 和 epoch 占用了 hashCode 的位置,所以,如果对象如果计算过 hashCode 后,便无法进入偏向锁状态,反过来,如果对象处于偏向锁状态,并且需要计算其 hashCode 的话,则偏向锁会被撤销,升级为重量级锁。
-
Klass Point(类型指针):对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
-
-
实例数据:这部分主要是存放类的数据信息,父类的信息。
-
字节对齐:为了内存的IO性能,JVM要求对象起始地址必须是8字节的整数倍。对于不对齐的对象,需要填充数据进行对齐。