1. 对象头结构图
一个对象的内存结构包括:运行时元数据、类型指针、实例数据、对齐填充
2. 对象头结构说明
对象头里包括(64位机器占96位):运行时元数据(Mark Word)(占64位)、类型指针(Klass Point)(占32位)
- 运行时元数据 包括:哈希值(HashCode)、GC分代年龄、锁状态标志
- 哈希值:31位的对象标识hashCode,采用延迟加载技术。调用方法System.identityHashCode()计算,并会将结果写到该对象头中。它是一个地址,用于栈对堆空间中对象的引用指向,不然栈是无法找到堆中对象的
- GC分代年龄(占4位):记录幸存者区对象被GC之后的年龄age,一般age为15(阈值为15的原因是因为age只有4位最大就可以将阈值设置15)之后下一次GC就会直接进入老年代,要是还没有等到年龄为15,幸存者区就满了怎么办,那就下一次GC就将大对象或者年龄大者直接进入老年代。
- 锁状态标志:记录一些加锁的信息
- 类型指针:是对方法区中类元信息的引用
- 实例数据:真实记录一个对象包含的数据,比如说一个person对象,里面可能包含年龄、性别、身高等等,其中数据为字符串的,要引用到字符串常量池。
- 对齐填充:填充部分仅起到占位符的作用, 原因是HotSpot要求对象起始地址必须是8字节的整数,假如不是,就采用对齐填充的方式将其补齐8字节整数倍。之所以是8是因为64位的机器能被8整除效率最高。
[
](https://blog.csdn.net/qq_43012792/article/details/107405527)