JVM中的对象头信息

JVM中对象头信息内容

对象头信息是与对象自身定义的数据无关的额外存储成本,HotSpot虚拟机中的对象头分为两部分信息

第一部分用于存储对象自身的运行时数据,如哈希码,GC分代年龄等,这部分数据在32位和64位的虚拟机中的长度分别为32bit和64bit,官方称这部分为“Mark Word”,它也是实现轻量级锁和偏向锁的关键。考虑到虚拟机的空间效率,Mark Word本设计成一个非固定的数据结构以便在极小的空间内存中存储尽量多的信息,它会根据对象的状态复用自己的存储空间。

存储内容标志位状态是否偏向

对象哈希码,对象分代年龄01未锁定0

指向锁记录的指针00轻量级锁定

指向重量级的指针10膨胀(重量级锁定)

空,不需要存储记录11GC标记

偏向线程ID,偏向时间戳,对象分代年龄01可偏向1

此处有疑问,轻量级锁的时候,Mark Word中的内容被复制到栈帧中,Mark Word存储的是内容所在栈帧的地址,那重量级锁存储的是和Mark Word内容无关的互斥量地址,此时的Mark Word中存储的哈希码等信息存放在哪里。

第二部分用于存储指向方法区对象类型数据的指针,如果是数组的话,还会有一个额外的部分用于存储数组长度

下面介绍轻量级锁和可偏向锁

轻量级锁

首先需要说明轻量级锁不是重量级锁的替代方案,其目的是在没有多线程竞争的前提下,减少传统重量级锁使用操作系统互斥量产生的性能消耗(使用互斥量会阻塞线程,使线程挂起,和唤醒,这两个操作都需要切换到操作系统内核态执行)

轻量级锁执行过程:在代码进入同步块的时候,如果此同步对象没有被锁定(标志位01),虚拟机首先将在当前线程的栈帧中建立一个锁记录的空间,用于存储锁对象目前的Mark Word拷贝—Displaced Mark Word,这个时候锁对象的Mark Word就存储在当前线程的栈帧中;然后虚拟机将使用CAS(操作系统级别保证该操作的原子性)操作尝试将对象头中的Mark Word内容更新为指向存储当前锁对象Mark Word内容的当前想进入同步块的线程栈帧的地址,如果这个更新成功,那么这个线程就拥有了该对象的锁,然后回写锁对象头的Mark Word中标志位为00

如果这个CAS操作失败,虚拟机首先会检查锁对象的头部Mark Word是否指向当前线程的栈帧,如果是说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明这个锁对象已经被其他线程抢占了。如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,标志位变为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也要进入阻塞状态。

以上是轻量级锁加锁过程,解锁过程也是使用CAS,只是将锁对象当前的Mark Word中的内容从线程栈帧地址替换为线程栈帧Displaced Mark Word的内容,如果替换成功,整个同步过程就结束了;如果替换失败,说明有其他线程尝试过获取该锁,那就要在释放锁的同时,唤醒被挂起的线程。

轻量级锁能够提升程序同步性能的依据是,大部分场景在同步周期内没有锁竞争,这个经验数据。如果没有竞争,轻量级锁使用CAS操作避免使用互斥量的开销,但是如果存在锁竞争,除了互斥量的开销还有CAS操作,因此会比重量级锁更慢

本处有一个疑问:CAS操作成功后获取到轻量级锁,后续其他线程试图CAS都会失败,所以理论上获取锁的线程CAS释放锁应该都会成功,怎么会失败????

偏向锁

偏向锁目的是在无竞争情况下,消除同步原语(不管是基于互斥量的还是底层CAS操作的支持的同步原语),

偏向锁意思是这个锁会偏向于第一个获取它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程将永远不需要进行同步。

如果当前虚拟机启动了偏向锁,那么当锁对象第一次被线程获取的时候,虚拟机会将锁对象头的标志位设置为01,同时使用CAS操作把获取到这个锁的线程ID记录在锁对象的对象头Mark Word中,如果CAS操作成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作。

当有另一个线程去尝试获取这个锁时,偏向模式就宣告结束。根据锁对象目前是否处于被锁定状态,如果之前线程锁定过偏向锁,目前没有锁定了,那就恢复到未锁定状态,如果偏向锁线程持有者还锁定着,那就升级到轻量级锁定状态,后续的同步操作就和上面的轻量级锁一样。

是啥

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359

推荐阅读更多精彩内容

  • JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步...
    施智沂阅读 707评论 0 1
  • Java中的偏向锁、轻量级锁与重量级锁(synchronized) 在多线程并发编程中synchronized一直...
    Duang了个Duang阅读 7,642评论 0 10
  • 第一次有了较为清晰地觉察到,内在一直无意识地在压念、试图忽略念头,在后脑勺处。而且压念的同时就是压制喉轮和心轮的感...
    如是这般美妙阅读 343评论 0 0
  • 六项精进打卡第501,姓名:孙维洁 六精进第364期乐2学员,403期乐2志工,456期乐2志工,496服务和带队...
    孙维洁阅读 101评论 0 0
  • 近来,小伙伴们都在家上网课。是不是有很多小伙伴发现了以下网课迷惑行为。 1. 上课必签到,签完接着睡 2. 一单基...
    Kyra彡阅读 362评论 0 2