对象头的结构

一、对象头的结构(32位虚拟机)

        1、普通对象

                   

普通对象头占用64 bits ,其中Mark word占32 bits ,Klass Words 占32bits。Klass Words 可以理解为指针,指向类对象。Mark Word下面会详解。 

        2、数组对象

                

  数组对象增加了4个字节的空间,用于存储数组长度。 

二、Mark Word介绍

        1、Mark Word结构     

                对象在不同情况下的结构会有所不同, 参考以下表格:

32位虚拟机Mark Word              

  64位虚拟机Mark Word 

        

  2、Mark Word 不同状态 

                1、Normal状态:此状态为普通状态,hashcode为对象的hashcode值 , age代表垃圾回收的分代年龄, biased_lock表示是否为偏向锁,最后两位代表加锁状态。

                2、Biased状态:此状态为偏向锁状态,thread指向获得偏向锁的线程,后3位为101表示对象为偏向锁状态。

                3、Lightweight Locked状态:轻量级锁状态,ptr_to_lock_record指向栈帧的锁记录。

                4、Heavyweight Locked状态:重量级锁,ptr_to_heavyweight_monitor指向Monitor。

   注意:

         1、当开启偏向锁时(默认开启),创建一个对象,对象的Mark Word为偏向锁状态,偏向锁是默认延迟的,不会在程序启动时立即生效。

        2、当禁用偏向锁时,创建的对象为普通状态,即使该对象被synchronized修饰,也不会变为偏向锁状态。

        3、如果对象调用hashcode方法,会自动禁用偏向锁,是因为偏向锁的对象头中没办法存储hashcode。轻量级锁把Mark Word的值存放在栈帧中,重量级锁把Mark Word的值存放在Monitor中。

三、Monitor介绍

        Monitor  是监视器的意思,在Java中被synchronized关键字修饰的对象头且为重量级锁时,会关联一个Monitor对象,Monitor有Owner、EntryList、WaitSet三个字段,分别表示Monitor的持有者线程(获得锁的线程)、阻塞队列、和等待队列。如下图:

        

         上图的情况下,MarkWord状态应为heavyweight Locked,ptr_to_heavyweight_monitor占用30位指向Monitor对象。Thread-2为Monitor的持有者,因此Thread-2是获得锁的线程,其它争抢锁的线程进入阻塞队列中。

 注意:不加synchronized关键字的对象,是不会关联Monitor对象的。只有重量级锁对象才会关联Monitor。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值