使用jol查看synchronized锁信息

简介: 使用jol查看synchronized锁信息

JOL

JOL 是OpenJdk发布的用查看对象在JVM中信息,全称是Java Object Layout。可以通过命令行使用。
下面例子中仅使用到了ClassLayout,有兴趣可以看看官网介绍。

pom依赖,jol 0.16版本没有使用字节码展示对象头而是直接展示了锁信息,与jstack日志一致,如果想查看对象头变化请使用 0.10版

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.16</version>
        </dependency>

synchronization

synchronization是同步关键字,下面的示例使用synchronization+jol查看锁信息。有兴趣可以直接运行看看效果,也可以直接拖到最后看看结论或者看看oracle官方解释。

JAVA代码

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

@Slf4j
public class SynchronizedDemo {

    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        SynchronizedDemo demo1 = new SynchronizedDemo();
        SynchronizedDemo demo2 = new SynchronizedDemo();
        new Thread(() -> {
            demo.lockMethod();
        }).start();
        new Thread(() -> {
            demo.lockInstance(demo1);
        }).start();
        new Thread(() -> {
            SynchronizedDemo.lockStaticMethod();
        }).start();
        log.info("打印demo头信息");
        log.info(ClassLayout.parseInstance(demo).toPrintable());
        log.info("打印demo1头信息");
        log.info(ClassLayout.parseInstance(demo1).toPrintable());
        log.info("打印demo2头信息");
        log.info(ClassLayout.parseInstance(demo2).toPrintable());
        log.info("打印Class头信息");
        log.info(ClassLayout.parseInstance(SynchronizedDemo.class).toPrintable());
    }

    public synchronized static void lockStaticMethod() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void lockMethod() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void lockInstance(SynchronizedDemo demo) {
        synchronized (demo) {
            try {
                Thread.sleep(1000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

打印日志

2022-06-15 15:28:48 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x000000002097f050 (thin lock: 0x000000002097f050)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo1头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000020a7ee10 (thin lock: 0x0000000020a7ee10)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印demo2头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : com.meijm.basis.concurrent.SynchronizedDemo object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE
  0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)
  8   4        (object header: class)    0xf800c105
 12   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : 打印Class头信息
2022-06-15 15:28:49 INFO    --- [main      ] c.m.basis.concurrent.SynchronizedDemo    : java.lang.Class object internals:
OFF  SZ                                              TYPE DESCRIPTION                    VALUE
  0   8                                                   (object header: mark)          0x000000001ba5570a (fat lock: 0x000000001ba5570a)
  8   4                                                   (object header: class)         0xf80003df
 12   4                     java.lang.reflect.Constructor Class.cachedConstructor        null
 16   4                                   java.lang.Class Class.newInstanceCallerCache   null
 20   4                                  java.lang.String Class.name                     (object)
 24   4                                                   (alignment/padding gap)        
 28   4                       java.lang.ref.SoftReference Class.reflectionData           (object)
 32   4   sun.reflect.generics.repository.ClassRepository Class.genericInfo              null
 36   4                                java.lang.Object[] Class.enumConstants            null
 40   4                                     java.util.Map Class.enumConstantDirectory    null
 44   4                    java.lang.Class.AnnotationData Class.annotationData           (object)
 48   4             sun.reflect.annotation.AnnotationType Class.annotationType           null
 52   4                java.lang.ClassValue.ClassValueMap Class.classValueMap            null
 56  32                                                   (alignment/padding gap)        
 88   4                                               int Class.classRedefinedCount      0
 92   4                                                   (object alignment gap)         
Instance size: 512 bytes
Space losses: 36 bytes internal + 4 bytes external = 40 bytes total
在代码运行时可使用jstack -l 进程id,查看具体锁信息,

结论

synchronization锁定的是JVM中运行的对象,静态方法锁定的是Class对象,代码块锁定的是括号中的对象。

参考资料

https://github.com/openjdk/jol

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

目录
相关文章
|
11月前
|
存储 缓存 Java
我们来详细讲一讲 Java NIO 底层原理
我是小假 期待与你的下一次相遇 ~
357 2
|
Java 程序员 Maven
【Maven运行报错及解决方案】错误 不再支持源选项 5。请使用 6 或更高版本。
【Maven运行报错及解决方案】错误 不再支持源选项 5。请使用 6 或更高版本。
1417 0
【Maven运行报错及解决方案】错误 不再支持源选项 5。请使用 6 或更高版本。
|
10月前
|
存储 机器学习/深度学习 Java
Java 大视界 -- Java 大数据在智慧水利水资源调度与水情预测中的应用创新(180)
本文探讨了Java大数据技术在智慧水利中的创新应用,重点分析了其在水资源调度与水情预测中的关键技术与实践案例。通过大数据存储、实时处理与深度学习模型,Java有效提升了水利数据管理效率与水情预测准确性,助力传统水利向智能化转型。
|
存储 架构师 安全
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
锁状态bits1bit是否是偏向锁2bit锁标志位无锁状态对象的hashCode001偏向锁线程ID101轻量级锁指向栈中锁记录的指针000重量级锁指向互斥量的指针010尼恩提示,讲完 如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等优化手段 , 可以得到 120分了。如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等‌。JVM锁的膨胀、锁的内存结构变化相关的面试题,是非常常见的面试题。也是核心面试题。
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
741 1
|
机器学习/深度学习 自然语言处理 搜索推荐
深度学习之分类网络
深度学习的分类网络(Classification Networks)是用于将输入数据分配到预定义类别的神经网络。它们广泛应用于图像分类、文本分类、语音识别等任务。以下是对深度学习分类网络的详细介绍,包括其基本概念、主要架构、常见模型、应用场景、优缺点及未来发展方向。
1389 4
|
网络协议 Linux 网络安全
CentOS7增加或修改SSH端口号
CentOS7增加或修改SSH端口号
1174 1
|
存储 安全 算法
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
深入探索Java中的MarkWord与锁优化机制——无锁、偏向锁、自旋锁、重量级锁
811 1
|
监控 固态存储 安全
源码剖析:Elasticsearch 段合并调度及优化手段
源码剖析:Elasticsearch 段合并调度及优化手段
抓包神器Charles:解析网络数据传输的秘密
Charles是一款跨平台代理工具,支持SSL代理、流量控制和网络请求截取修改,适用于Mac、Windows和Linux。它提供自动格式化的JSON或XML数据查看,便于调试。安装可从官方网站或学社下载。软件界面包含菜单栏(File、Edit、View、Proxy、Tools)和主导航栏(Structure、Sequence)。左侧视图按域名或时间排序请求,右侧显示请求详情,如Overview、Content、Summary、Chart和Notes,方便分析和记录接口信息。