对象的内存分布分为两种:
普通对象:
- 对象头/markword:记录对象的分代年龄、锁状态、hashcode/偏向锁的线程Id等
- ClassPointer指针:指向当前类的class对象
- 实例数据
- Padding对齐
数组对象(多了一个数组长度):
- 对象头/markword
- ClassPointer指针
- 数组长度
- 数组数据
- Padding对齐
对象大小与操作系统的位数有关(这里以64位机为例)
除操作系统位数外,还与虚拟机配置有关
查看虚拟机配置
java -XX:+PrintCommandLineFlags -version
-XX:+UseCompressedClassPointers 对应 ClassPointer指针的大小,开启为4字节 不开启为8字节
-XX:+UseCompressedOops对应对象中引用类型属性的大小,开启为4字节 不开启为8字节