Java对象头Mark Word的深度定制:利用偏向锁/轻量级锁解决高竞争问题
大家好,今天我们深入探讨Java对象头的Mark Word,以及如何利用偏向锁和轻量级锁来优化高竞争场景下的性能。Mark Word是Java对象头中非常关键的一部分,它记录了对象的锁状态、GC信息、哈希值等重要数据。理解Mark Word的结构以及锁的升级过程,对于编写高性能的并发程序至关重要。
1. 对象头与Mark Word
在HotSpot虚拟机中,Java对象在内存中的布局通常由三个部分组成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含了Mark Word和Klass Pointer。Klass Pointer指向描述对象类型的Class对象,而Mark Word则存储了与对象自身密切相关的信息,例如哈希值、GC分代年龄、锁状态标志等等。
Mark Word的结构并非固定不变,而是会根据对象的锁状态而动态变化。在32位和64位JVM中,Mark Word的长度分别是4字节和8字节。下面分别展示了在不同锁状态下,64位JVM中Mark Word的结构:
1.1 无锁状态(Normal)
| 字段 | 大小(bit) | 描述 |
|---|---|---|
| unused | 25 | 未使用,可以用于存储其他信息,例如epoch |
| identity_hashcode | 31 | 对象的哈希值,调用hashCode()方法时生成 |
| unused | 1 | |
| age | 4 | GC分代年龄 |
| biased_lock | 1 | 偏向锁标志,0表示未启用偏向锁 |
| lock | 2 | 锁标志位,01表示无锁状态 |
1.2 偏向锁状态(Biased)
| 字段 | 大小(bit) | 描述 |
|---|---|---|
| thread | 54 | 持有偏向锁的线程ID |
| epoch | 2 | 偏向时间戳,用于撤销偏向锁 |
| age | 4 | GC分代年龄 |
| biased_lock | 1 | 偏向锁标志,1表示启用偏向锁 |
| lock | 2 | 锁标志位,01表示偏向锁状态 |
1.3 轻量级锁状态(Lightweight Locked)
| 字段 | 大小(bit) | 描述 |
|---|---|---|
| ptr_to_lock_record | 62 | 指向Lock Record的指针,Lock Record位于线程栈帧中 |
| lock | 2 | 锁标志位,00表示轻量级锁状态 |
1.4 重量级锁状态(Heavyweight Locked)
| 字段 | 大小(bit) | 描述 |
|---|---|---|
| ptr_to_monitor | 62 | 指向Monitor对象的指针,Monitor由操作系统提供 |
| lock | 2 | 锁标志位,10表示重量级锁状态 |

最低0.47元/天 解锁文章
325

被折叠的 条评论
为什么被折叠?



