1 Java对象布局
1.1 普通对象
普通Java对象由对象头、实例数据和8字节对齐组成,其中对象头又包含Markword和ClassPointer。其中Markword占8个字节,ClassPointer在默认开启指针压缩的情况下(-XX:+UseCompressedClassPointers),占4个字节。8字节对齐是指一个对象在内存中所占字节数必须为8的倍数,所以如果对象所占字节不是8的倍数的时候,需要Padding来对齐。
1.2 数组
数组对象由对象头、数组长度、数组数据和8字节对齐组成,其中数组长度占4个字节。
2 对象定位
对象定位一般有句柄和直接指针两种方式,这两种方式各有其优缺点,Java中使用的是直接指针的方式。
2.1 句柄
句柄访问方式是指,从堆中划分出一块区域作为句柄池,reference的值其实是句柄的地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。其优点在于reference中存储的是稳定的句柄地址,在对象被移动时(垃圾回收过程)只会改变句柄中的实例数据指针,而reference本身不需要被修改。
2.2 直接指针
直接指针访问是指,Java对象中包含了类型指针以及实例数据,reference的值为对象的地址地址。其优点在于速度更快,相比句柄访问节省了一次指针定位的时间开销。