Object o = new Object()占多少个字节?-对象的内存布局 (3)

Object o = new Object()占多少个字节?-对象的内存布局

Object o = new Object()占多少个字节?-对象的内存布局

可以看到,对象头所占用的内存大小变为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()); } }

Object o = new Object()占多少个字节?-对象的内存布局

可以看到,对象大小变成了24Byte,其中mark word占8Byte,klass pointer占4Byte,int占4Byte,char占2Byte,boolean占1Byte,padding占1Byte,String类型的变量a占4Byte,也验证了我们上面说的“为了提高存储空间的利用率,这部分数据的存储顺序会受到虚拟机分配策略参数和字段在Java源码中定义顺序的影响”,可以看到内存中的布局顺序确实和我们定义的不一样。

此时我再关闭两个指针压缩,再看看布局变化:

Object o = new Object()占多少个字节?-对象的内存布局

Object o = new Object()占多少个字节?-对象的内存布局

可以看到,对象总大小变成了32Byte,和开启压缩指针相比,klass pointer大了4Byte,String类型的变量a大了4Byte。符合我们上面的结论。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppwzy.html