可以看到,对象头所占用的内存大小变为16Byte,其中mark word占8Byte,klass pointer占8Byte,无padding。
至此,已经证明了我们上面的结论是正确的。
有成员变量的对象我们现在再给Test01类里加4个成员变量,开启指针压缩,看看它的布局吧
public class Test01 { String a = "a"; int b = 1; boolean c = false; char d = 'd'; public static void main(String[] args) { Test01 t = new Test01(); System.out.println(ClassLayout.parseInstance(t).toPrintable()); } }可以看到,对象大小变成了24Byte,其中mark word占8Byte,klass pointer占4Byte,int占4Byte,char占2Byte,boolean占1Byte,padding占1Byte,String类型的变量a占4Byte,也验证了我们上面说的“为了提高存储空间的利用率,这部分数据的存储顺序会受到虚拟机分配策略参数和字段在Java源码中定义顺序的影响”,可以看到内存中的布局顺序确实和我们定义的不一样。
此时我再关闭两个指针压缩,再看看布局变化:
可以看到,对象总大小变成了32Byte,和开启压缩指针相比,klass pointer大了4Byte,String类型的变量a大了4Byte。符合我们上面的结论。