Java利用ClassLayout查看对象头
1.添加依赖
不同的版本,打印信息不同
<!--查看对象头工具-->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.16</version>
</dependency>
2.mark word说明
Mark Word 64 位, 格式如下:
3.查看对象头(0.9版本)
public class Juc_book_fang_04_JolTest_02 {
public static void main(String[] args) {
Object dog = new Object();
System.out.println("初始信息:"+ClassLayout.parseInstance(dog).toPrintable());
System.out.println(dog.hashCode());
System.out.println("hashcode信息:"+ClassLayout.parseInstance(dog).toPrintable());
synchronized (dog) {
System.out.println("加锁后信息:"+ClassLayout.parseInstance(dog).toPrintable());
}
System.out.println("释放锁后信息:"+ClassLayout.parseInstance(dog).toPrintable());
}
}
对比生成 hashcode 前后 发现, 只有第二段到第五段有变化 第六到八段依旧为 0,那么第六到八段应该就是 25 位的 unused , 第二到五段应该就是 31 位的 hashcode. 但是根据 64 位的 mark word 格式来看, 应该是 25 位的 unused 排在 hashcode 前面并且结尾应该为 01, 所以这段是倒叙排列的.
jol 获取的对象头是前八段倒叙排列,倒序的有点可以参考redis的二进制处理,也是使用的倒序.原理都是相通的.
4.查看对象头(0.16版本)
public class Juc_book_fang_04_JolTest_02 {
public static void main(String[] args) {
final Object obj = new Object();
System.out.println("启动后对象布局:\n" + ClassLayout.parseInstance(obj).toPrintable());
//JKD8延迟4S开启偏向锁
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//可偏向 101
final Object monitor = new Object();
System.out.println("延迟5秒后对象布局:\n" + ClassLayout.parseInstance(monitor).toPrintable());
//偏向锁
synchronized (monitor) {
System.out.println("对象加锁后的布局:\n" + ClassLayout.parseInstance(monitor).toPrintable());
}
System.out.println("对象释放锁后的布局:\n" + ClassLayout.parseInstance(monitor).toPrintable());
}
}
今天的文章【并发编程】Java利用ClassLayout查看对象头分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31914.html