在HotSpot虚拟机中,一个对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
其中对象头包含两部分信息:
1,一部分用于存储对象自身的运行时数据(Mark Word),如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
2,一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
3,如果对象是一个java数组,那么在对象头中还有一块用于记录数组长度的数据。
Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息。
Mark Word被划分为多个比特位区间,并在不同的对象状态下赋予比特位不同的含义。
对象的状态包含:无锁状态,轻量级锁,重量级锁,GC标记,偏向锁。