Java 里的对象在虚拟机里面是怎么存储的?

Sherwin.Wei Lv8

Java 里的对象在虚拟机里面是怎么存储的?

回答重点

Java 对象在虚拟机中的存储由以下几个部分组成:

image.png

对象头(Header):包含对象的元信息和运行时数据。主要由以下三部分构成:

  • Mark Word:用于存储运行时数据,例如对象的哈希码(HashCode)、GC 标记信息、锁状态标志等。它是一个多功能字段,会根据对象的状态动态变化。
  • 类型指针(Class Pointer):指向对象对应的类的元数据,用于确定该对象的类型。
  • 数组长度(只有数组才有)

实例数据(Instance Data):存储对象的实际数据,即类的字段(包括从父类继承的字段)。

对齐填充(Padding):为了满足内存对齐要求(一般是 8 字节对齐),JVM 可能会在对象末尾添加填充字节。例如,一个对象大小为 12 字节,JVM 会增加 4 字节填充,使其达到 16 字节对齐。

存储位置

堆(Heap):大多数对象分配在堆中,堆是 JVM 管理的内存中最大的一块区域。堆内部分为以下区域:

  • 新生代(Young Generation):刚创建的对象通常存放在 Eden 区,经过一次或多次 GC 后可能晋升到 Survivor 区或老年代。
  • 老年代(Old Generation):存放生命周期较长的对象,经过多次 GC 后未被回收的对象会晋升到老年代。

扩展知识

64 位 MarkWord 在不同状态下的内存布局

MarkWord 结构之所以搞得这么复杂,是因为需要节省内存,让同一个内存区域在不同阶段有不同的用处。

image.png
Comments