对象在对内存中的存储布局可以划分为三个部分:对象头,实例数据,对齐填充

1 对象头:对象头包含两个部分,第一类是用于存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等这部分数据在32位和64位的虚拟机分别对应32bit集合64bit,官方称为Mark Word,对象需要存储的运行时数据很多,已经超出了32bit或64bit的最大限度,但对象头里的信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个有着动态定义的数据结构,便于在极小的空间存储尽量多的数据,根据对象的状态复用自己的存储空间;对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,虚拟机通过这个指针来确定该对象是哪个类的实例,如果对象是个数组,那对象头必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通java对象的元数据获取java对象的大小,但是无法获取数组的长度

2实例数据:对象真正存储的有效信息,即程序中定义的各种类型的字段内容

3对齐填充:这部分不是必然存在的,也没有特别的含义,仅仅起着占位符的作用,因为虚拟机内存管理系统的起始地址必须是8字节的整数倍,对象头是被精心设计成正好是8字节的倍数,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全