java中对象的gc年龄不存储在mark word中,而是由jvm在gc过程中动态维护于oopdesc结构或gc管理数据结构中;mark word仅存放哈希码、锁状态、类指针等信息,其所有布局均无gc年龄位段。

Java中对象的年龄(Age)计数器并不存储在Mark Word中。
对象年龄由JVM内部维护,与Mark Word无关
对象的GC年龄(即经历Minor GC的次数)是JVM在垃圾回收过程中动态维护的元信息,属于分代收集器的运行时状态,不是对象头的一部分。HotSpot虚拟机中,该年龄记录在对象对应oopDesc结构的额外字段或GC管理数据结构(如G1的Remembered Set、CMS的Card Table辅助信息)中,并非编码进Mark Word。
Mark Word主要存放以下内容(取决于对象状态):
- 哈希码(未锁且未迁移时)
- 指向类元数据的指针
- 锁状态标志(无锁、偏向锁、轻量级锁、重量级锁)
- 线程ID(偏向锁状态下)
- 指向monitor或Lock Record的指针(加锁后)
年轻代晋升年龄阈值由JVM参数控制
对象从年轻代晋升到老年代的年龄阈值由参数-XX:MaxTenuringThreshold设定,默认值为15(在大多数HotSpot版本中)。当对象在Survivor区中“活过”指定次数的Minor GC后,下次GC时将被晋升至老年代。
注意:该阈值是逻辑上限,实际晋升可能更早——例如Survivor空间不足时,JVM会触发“动态年龄判定”,将累计大小达到Survivor一半的年龄最小的一批对象直接晋升,不严格依赖计数器。
Mark Word中没有专门的年龄位段
以64位HotSpot为例,Mark Word共64bit,在不同锁状态和对象状态下有不同布局,但所有已知布局中均未定义任何bit用于存储GC年龄。例如:
- 普通无锁对象:高31位存hashcode(若已计算),低32位存klass pointer(开启压缩指针时)
- 偏向锁:存thread ID、epoch、age(这里的age是偏向锁的epoch age,与GC年龄完全无关)
- 轻量级锁:存指向栈中Lock Record的指针
其中“biased_lock=1, age=0”中的age字段仅用于偏向锁重偏向机制的epoch比对,与对象在GC中的存活年龄无任何语义或实现关联。
对象年龄是GC子系统独立维护的运行期统计量,不占用对象头空间。理解这一点有助于避免误读JVM内存布局文档或调试工具输出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











