【并发编程】Java利用ClassLayout查看对象头

【并发编程】Java利用ClassLayout查看对象头不同的版本,打印信息不同2.markword说明MarkWord64位,格式如下:对比生成hashcode前后发现,只有第二段到第五段有变化第六到八段依旧为0,那么第六到八段应该就是25位的unused,第二到五段应该就是31位的hashcode.但是根据64位的markword格式来看,应该是25位的unused排在hashcode前面并且结尾应该为01,所以这段是倒叙排列的.jol获取的对象头是前八段倒叙排列,倒序的有点可以参

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 位, 格式如下:

img

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());
    }
}

image-20220607194718549

对比生成 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());
    }
}

image-20220607195545022

今天的文章【并发编程】Java利用ClassLayout查看对象头分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31914.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注