Java对象头打印JDk1.8 64位

 <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.9</version>
        </dependency>
package learn.cn.多线程;

/**
 * create by liuzhiwei on 2020/4/2
 */
public class JavaObjectHead {
    //boolean flag;//1 byte
    int flag;//4 byte
}

package learn.cn.多线程;

import org.openjdk.jol.info.ClassLayout;

/**
 * create by liuzhiwei on 2020/4/2
 * Java对象头 64位虚拟机
 * <p>
 * 对象头 mark word 4Byte 32bits 实际上  12byte=96bit  周志明第二版2008年出版的(32位虚拟机)
 * mark word (64bit) + klass pointer/Class MetaData address(32bit/64bit(无压缩) = 12Byte
 * <p>
 * 实例变量
 * 对齐填充
 * 8Bytes 的倍数
 * <p>
 * 哈希码 GC标记 GC次数 同步锁标记 偏向锁持有者
 * <p>
 * synchronized对象状态
 * 无状态
 * 偏向锁
 * 轻量锁
 * 重量锁
 * gc标记
 */
public class JavaObjectHeadTest {

    public static void main(String[] args) {
        JavaObjectHead head = new JavaObjectHead();
        
        System.out.println(head.hashCode());//大端小端存储
        System.out.println(Integer.toHexString(head.hashCode()));//大端小端存储
        
        System.out.println(ClassLayout.parseInstance(head).toPrintable());
        synchronized (head) {
            System.out.println("加锁");
        }
    }
}

1.3.jar:/Users/liuzhiwei/.m2/repository/org/openjdk/jol/jol-core/0.9/jol-core-0.9.jar learn.cn.多线程.JavaObjectHeadTest
1725154839
66d3c617
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
learn.cn.多线程.JavaObjectHead object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 17 c6 d3 (00000001 00010111 11000110 11010011) (-741992703)
      4     4        (object header)                           66 00 00 00 (01100110 00000000 00000000 00000000) (102)
      8     4        (object header)                           43 c1 00 f8 (01000011 11000001 00000000 11111000) (-134168253)
     12     4    int JavaObjectHead.flag                       0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

加锁

Process finished with exit code 0

在这里插入图片描述

在这里插入图片描述
Synchronized锁对象 普通对象 类对象

Synchronized(Object) 不能用String Long Integer 常量 Object 为null

可重入 父子类
独占锁
悲观锁

锁升级(对象头 markword)

  • 无锁
  • 偏向锁:第一个线程 偏向第一个线程 如果有多个线程竞争的时候升级为轻量级锁 可以关闭偏向锁,默认开启
  • -XX:+UseBiasedLocking关闭偏向锁
  • 轻量级 自旋锁(CAS 自旋10次 消耗cpu计算资源): (加锁代码)执行时间短 线程数少 lockrecord 将markword 复制到lockrecord
  • 重量级锁(操作系统内核锁 排队 不消耗cpu计算资源): 执行时间长 线程数多
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章