JVM是由一个对应角色的oop对象来描述Java对象:
- instanceOopDesc
- 描述普通实例对象
- arrayOopDesc 描述数组对象
这些类型的oop对象均是继承自oopDesc:
oopDesc主要包含
_mark
一个markOop实例,它描述了一个对象的头信息,用于存储对象的运行时记录信息,如hashCode、GC分代年龄、是否偏向锁、锁状态标志(默认无锁)、线程持有的锁、偏向线程ID、偏向时间戳等。
运行期间,Mark Word里存储的数据会随着是否偏向锁、锁标志位的变化而变化,如下图五种状态中其中一种,即同一时刻MarkWord只能表示其中一种锁状态:
锁标志位状态只有如下四种:
无锁和偏向锁的锁标志位都是01,那Mark Word如何区分呢?如下图,Mark Word的五种状态都有共同的信息字段:
- 是否偏向锁(biased_lock)
- 锁标志位(lock)
所以,锁标志位和是否偏向锁两个信息字段组合就能表示五种Mark Word状态。
_metadata
- 一个普通_klass
- 一个压缩后的_compressed_klass