Java对象头
    JVM中,每个Java对象都有一个对象头,这个由标记字段、类型指针和字段对齐所构成。标记字段用以存储JVM有关该对象的运行数据,如哈希码、GC信息以及锁信息,而指针类型则指向该对象的类。对象头的标记字段占64位,类型指针占64位
    每个Java对象在内存中的额外开销就是16个字节。以Integer为例,它仅有一个int类型的私有字段,占4个字节,因此每个Integer对象的额外内存开销至少是400%,这样也是Java引入基本类型的原因之一。

    压缩指针
    引入压缩指针之后,堆中原本64位的Java对象指针压缩成32位的。对象头中的类型指针也会被压缩成32位。那么类型指针变为32位,对象头的16字节(128位)变为12字节(96位)。

    字段对齐**
    默认情况下,JVM堆中对象的其实地址需要对齐至8的背书。如果一个对象用不到8N个字节,那么空白的部分就会被浪费,这些被浪费掉的空间我们称之为对象间的填充。
    为什么要字段对齐?
    目的是为了让字段只出现在同一CPU的缓存行中。如果不是对齐的,那么字段的读取可能需要替换两个缓存行,该字段的存储也会同时污染两个缓存行。

    字段重排列
    JVM重新分配字段的先后顺序,以达到内存对齐的目的。
    排列方法会遵循一下两个规则。
    1、如果一个字段占据C个字节,那么该字段的偏移量需要对齐至NC。这里偏移量指的是字段地址与对象的起始地址差值。以long类为例,它仅有一个long类型的实例字段。在使用了压缩指针的64位虚拟机中,尽管对象头的大小为12个字节,该long类型字段的偏移量也只能是16。
    2、子类所继承字段的偏移量,需要与父类对应字段的偏移量保持一致。