Java JVM内存结构中对象头包含什么
对象头(object header)主要包含两部分内容:哈希码等元数据信息和数组长度(如果是数组)。在64位jvm中,默认开启压缩指针时,普通对象的对象头为12字节(8字节的mark word + 4字节的klass pointer),数组对象在此基础上额外增加4字节的数组长度。若未开启压缩指针或启用64位哈希,大小会相应扩展。

Mark Word在不同状态下存储哪些具体信息
Mark Word是一个可变长度的数据结构,其内部存储的具体信息取决于对象当前的锁状态和GC标记情况。它通常占用32位或64位,通过低位的几位标志位来区分当前是偏向锁、轻量级锁、重量级锁还是无锁状态,并存储对应的锁记录指针、哈希值或GC分代年龄等信息。

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
public class ObjectHeaderDemo {
public static void main(String[] args) {
// 创建一个普通对象
Object obj = new Object();
// 使用JOL (Java Object Layout) 查看对象内存布局
// 需要引入 dependency: org.openjdk.jol:jol-core
String info = ClassLayout.parseInstance(obj).toPrintable();
System.out.println(info);
// 如果是数组,例如 int[10]
int[] arr = new int[10];
String arrInfo = ClassLayout.parseInstance(arr).toPrintable();
System.out.println(arrInfo);
}
}
运行上述代码(需添加JOL依赖),输出结果将显示具体的字节分布。对于普通对象,前几个字节对应Mark Word,紧接着是Klass Pointer。对于数组对象,在Klass Pointer之后会多出4个字节的数组长度字段。这验证了对象头结构的组成。
基于程序中某个输入、条件或结果的具体问题
当对象被同步锁定时,Mark Word中的内容会发生动态变化。在无锁状态下,它存储哈希值和GC年龄;在偏向锁状态下,它存储线程ID和偏向时间戳;在轻量级锁状态下,它指向栈帧中的锁记录;在重量级锁状态下,它指向堆中的监视器对象。这种结构上的变化是JVM优化锁竞争的核心机制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










