JVM—Java对象
JVM中的Java对象在堆内存中的存储分布可以分为对象头,实例数据和对齐填充三部分
对象头:
包含运行时元数据和类型指针
1、Mark Word(标记字段)
对象自身的运行时数据:
- 锁状态标志(无锁、偏向锁、轻量级锁、重量级锁、GC标记)
- 哈希码
- 分代年龄(用于分代GC)
- 线程ID(偏向锁持有者)
长度:
- 32位JVM:4字节
- 64位JVM:8字节,开启指针压缩(-XX:+UseCompressedOops)后可能优化为4字节
数组长度(仅数组对象有)
实例数据
存储对象的字段数据(包括从父类继承的字段)排列顺序受,字段分配策略 影响:
- 默认策略:按
long/double
→int/float
→short/char
→byte/boolean
→引用类型
降序排列。 - 父类字段在前,子类字段在后。
- 相同宽度的字段会被分配在一起(减少内存填充)。
对齐填充:
- JVM要求对象大小必须是8字节的整数倍,如果对象头+实例数据总大小不满足会额外填充字节。
- 作用:优化内存访问性能(CPU按块读取,对齐后减少缓存行未命中)