1 对象说明

查看对象构成

添加依赖

  1. <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
  2. <dependency>
  3. <groupId>org.openjdk.jol</groupId>
  4. <artifactId>jol-core</artifactId>
  5. <version>0.16</version>
  6. </dependency>

image.png

  1. // 通过sun公司提供的工具类jol将对象信息格式化打印
  2. System.out.println(ClassLayout.parseInstance(Object).toPrintable());

可以看出对象分配内存大小为8的倍数 ,当前对象为12个bytes, 4个byte为填充补齐 , 总共16bytes , 如果在对象中添加一个int a ;则不会有这个问题 因为一个int占4个 byte

查看对象头 Object Header

可以参考 hotspot 文档说明
https://openjdk.org/groups/hotspot/docs/HotSpotGlossary.html

image.png
每个 GC 管理的堆对象开头的通用结构。 (每个 oop 都指向一个对象头。)包括有关堆对象布局、类型、GC 状态、同步状态和身份哈希码的基本信息。 由两个词组成。 在数组中,紧随其后的是一个长度字段。 请注意,Java 对象和 VM 内部对象都具有共同的对象头格式。

klass pointer 主要包含指针信息占32位
mark word 主要包含锁标记, GC状态, hashcode
image.png
image.png
上图中
偏向标识说明 1 表示可偏向 0 表示不可偏向(有hashcode的情况)
lock两位数字说明
01 对象刚创建可偏向
00 轻量锁 线程交替执行 比如Thread1.join() ; 然后Thread2在start();
10 重量锁 两个或者多个线程出现竞争资源
有hashcode 不可偏向直接升级为轻量锁 , 无hashcode从偏向锁开始
偏向锁的效率高的原因是因为不走操作系统,而是通过CAS将线程ID保存下来,每次去比对线程ID是否一致
轻量锁

synchronized不同位置 区别