外观
一句话答案
Java 对象三部分:对象头(Mark Word + 类型指针)+ 实例数据 + 对齐填充(8 字节对齐)。
核心要点
三部分结构:
对象头(Header):
- Mark Word(8 字节/64位):存储哈希码、GC 年龄、锁标志位、偏向线程 ID
- 类型指针(4/8 字节):指向类元数据(确定是哪个类的实例)
- 数组长度(仅数组对象有,4 字节)
实例数据(Instance Data):各字段的值(按宽度排序,相同宽度的父类字段优先)
对齐填充(Padding):保证对象大小是 8 字节的整数倍
Mark Word(64位/无锁状态):
|---unused:25---|---hashcode:31---|---unused:1---|---age:4---|---biased:1---|---lock:2---|- age: GC 年龄(最大15,晋升阈值)
- lock: 01无锁/00轻量级/10重量级/11GC标记/01偏向
- 指针压缩:
-XX:+UseCompressedOops(默认开启,8字节→4字节)
追问与易错
追问方向:
- 什么是指针压缩?什么时候失效?
- Mark Word 在不同锁状态下存什么?
- 怎么计算一个对象占多少内存?
易错点:
- ❌ 忽略对齐填充——大小必须是 8 字节整数倍
- ❌ 64 位 JVM 指针就是 8 字节——压缩后是 4 字节
💡 记忆锚点
对象三段论:对象头(身份证,含Mark Word的hash/年龄/锁状态 + 类型指针)、实例数据(真正的家当)、对齐填充(凑8字节整数倍的占位符)。Mark Word的age字段只有4位所以GC年龄最大15,锁标志位随锁升级而变。