Skip to content
进阶

一句话答案

Java 对象三部分:对象头(Mark Word + 类型指针)+ 实例数据 + 对齐填充(8 字节对齐)。

核心要点

三部分结构:

  1. 对象头(Header)

    • Mark Word(8 字节/64位):存储哈希码、GC 年龄、锁标志位、偏向线程 ID
    • 类型指针(4/8 字节):指向类元数据(确定是哪个类的实例)
    • 数组长度(仅数组对象有,4 字节)
  2. 实例数据(Instance Data):各字段的值(按宽度排序,相同宽度的父类字段优先)

  3. 对齐填充(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,锁标志位随锁升级而变。