在HotSpot VM中,对象在内存中布局可分为3块区域:对象头(Mark Word + Class Pointer),实例数据和对齐填充。
我们先了解一些参数:
以Object o = new Object();为例,Mark Word 8个字节,class pointer在开启压缩指针情况下4个字节,由于无成员变量,实例数据为0,由于要被8整除(HotSpot VM的自动管理系统要求对象起始地址必须是8的倍数,笔者猜想主要为了提高效率),填充4字节,共16字节。
使用工具:JOL (Java Object Layout)
若没有开启UseCompressedClassPointers又是占多少字节呢?Mark Word 8个字节,class pointer 8个字节,由于无成员变量,实例数据为0,共16,可被8整除,所以为16字节;
若有成员变量呢?比如
User{
int id;
String name;
}
Mark Word 8个字节,class point 4个字节,int类型4个字节,String默认开启压缩(UseCompressedOops)4个字节,填充4字节,所以为24字节。
其中有很多笔者观点,若有错误,欢迎指正。