对象的内存布局一般分为两种,第一种是普通对象,第二种是数组对象。
观察虚拟机配置命令
java -XX:+PrintCommandLineFlags
普通对象
- 对象头,在HotSport里被称为markword,长度是8个字节。
- ClassPointer指针,-XX:+UseCompressedClassPointers这个参数开启长度为4个字节,不开启为8个字节。
- 实例数据(包括成员变量,引用类型:-XX:+UseCompressedOops这个参数开启长度为4个字节,不开启为8个字节)。
- padding对齐,是8的倍数。(因为HotSpot要求对象起始地址必须是8字节的整数倍,所以如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全)。
数组对象
- 对象头markword同上。
- ClassPointer指针同上。
- 数组长度占4个字节。
- 数组的数据。
- padding对齐同上。