java查看对象头信息_Java锁升级的过程及对象头中的信息

一、先了解一下对象头是什么

HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度在32位和64位的虚拟机中分别为32个和64个Bits,官方称它为“Mark Word”。本实例是基于jdk8,已经默认开启指针压缩。

Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例如在32位的HotSpot虚拟机 中对象未被锁定的状态下,Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志 位,1Bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下图所示。

76a4d29a21d1bbd2707a7255a9ab2836.png

对象头的前64位是MarkWord,后32位是类的元数据指针(开启指针压缩)。

二、利用jol打印对象头中的信息

如下所示,画红线的部分是存储的hash值,“00000001”为分解为“0 0000 0 01”,“01”为锁标识位,“0”表示是否为偏向锁,“0000”表示分代年龄,最高位“0”未使用;从中可以看出当前为无锁状态。

由于MarkWord其实是一个指针,在64位jvm下占8字节。因此MarkWordk是0x0000006ff3c5b5,跟你从图中看到的正好相反,这里涉及到一个知识点“大端存储与小端存储”,JVM里采用的小端存储(Little-Endian)。

Little-Endian:低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。

Big-Endian:高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。

执行如下代码:

输出:

“011100 00”中后2位是“00”,此时是轻量级锁,那么前面62位就是指向栈中锁记录的指针。“00000000 00000000 00000000 00000000 00000011 01000111 11111000 011100”。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值