对象占据的内存区域大体可以分为三块,对象头,实例数据,和对齐填充
hotspot里面的对象头包含两部分信息,第一是存储对象自身的运行时数据,如HashCode,GC分代,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等,这部分数据被称为markword,在32和64位虚拟机中分别占据32bit和64bit的内存,为了能在这么小的空间内存储足够的信息,实际上虚拟机会采用非固定的数据结构存储这些信息,比如32位的虚拟机中,在对象未被锁定的状态下,25bit用于存储hash码,4bit存储对象分代年龄,2bit存储锁标志位,1bit固定为0(表示偏向锁状态),
GC分代年龄由4bit存储,也就是0000-1111的范围,所以分代年龄最大为15
锁标志位有
00,01,10,11
对象头的另一部分是类型指针,即对象指向的所属的类元数据的指针,虚拟机通过该指针确定这个对象是哪个类的实例,这不是必须的,也有的实现不保留类型指针。另外,如果对象是一个java数组,那么对象头中还有一个区域用于记录数组长度,因为虚拟机可以通过java对象的元数据信息确定java对象的大小,但无法从数组的元数据确定数组的大小。