对象的内存布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头
对象头由对象标记Mark Word和类元信息(又叫类型指针)构成
对象标记Mark Word
在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节
在64位虚拟机下,Mark Word是64bit大小的,其存储结构如表所示:
对象标记默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
实例数据
存放类的属性(Field)数据信息,包括父类的属性信息
对齐填充
虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。例如一个对象的大小为10字节,那么对齐填充会补充6字节,将对象的大小变为16字节。
源码部分:
_mark字段是mark word,_metadata是类指针 klass pointer,对象头(object header)即是由这两个字段组成。
对象分代年龄
GC年龄采用4位bit存储,最大为15,例如MaxTenuringThreshold参数默认值就是15。
bit(比特) byte(字节) 1字节=8比特
bit(比特) byte(字节) 1字节=8比特 ,对象分代年龄为4bit在十进制下为15,所以分代年龄最大为15