
不同的版本,打印信息不同
2.mark word说明org.openjdk.jol jol-core 0.9 org.openjdk.jol jol-core 0.16
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());
}
}