首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JVM 的Lock Record简介

JVM 的Lock Record简介

作者头像
JavaEdge
修改2025-05-30 17:25:18
修改2025-05-30 17:25:18
8810
举报
文章被收录于专栏:JavaEdgeJavaEdge

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

1 作用

Lock Record用于偏向锁、轻量级锁优化。

  • 持有displaced word和锁住对象的元数据
  • 解释器使用lock record,检测非法的锁状态
  • 隐式充当锁重入机制的计数器

Lock Record用于轻量级锁优化,不同的是:

  • 存储为偏向锁状态的对象头(Mark Word为偏向锁)不包含指向Lock Record的指针
  • 轻量级锁状态包含指向Lock Record的指针

每个线程的线程私有栈里存储着一或多个Lock Record(支持可重入),如下图:

2 数据结构

lock record保存对象mark word的原始值,还包含识别哪个对象被锁的所必需的元数据。

Lock Record的结构:

  • Displaced Mark Word

该字段与轻量级锁关系更紧密,与偏向锁无关。存储的是锁对象的对象头中无锁状态的Mark Word , 以便释放锁时恢复Mark Word(例如保留了hash值等信息)

  • Object Reference

该字段与偏向锁、轻量级锁、重量级锁都有关。存储的是锁对象的对象头的指针,即指向了锁对象的对象头。

在openjdk中通过两个类BasicObjectLock和BasicLock来实现

代码语言:cpp
复制
// A BasicObjectLock associates a specific Java object with a BasicLock.
// It is currently embedded in an interpreter frame.
class BasicObjectLock {
  friend class VMStructs;
 private:
  BasicLock _lock; // 锁, must be double word aligned
  oop       _obj; // 持有锁的对象
};


class BasicLock {
 private:
  volatile markOop _displaced_header; // 存储锁对象的 Mark Word 的拷贝
};

3 创建时机

当字节码解释器执行monitorenter字节码,轻量地锁住一个对象时,就会在获取锁的线程的栈上显式或隐式分配一个lock record。

4 创建位置

Interpreted frames contain a region which holds the lock records for all monitors owned by the activation. During interpreted method execution this region grows or shrinks depending upon the number of locks held.

解释帧包含一个区域,该区域保存激活拥有的所有监视器的锁记录。在解释的方法执行期间,该区域根据持有的锁数量增长或缩小。

所以lock record在线程的Interpretered Frame上分配。

参考:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 作用
  • 2 数据结构
  • 3 创建时机
  • 4 创建位置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档