JVM优化之使用Jstack命令查找JVM死锁

JVM优化之使用Jstack命令查找JVM死锁

示例代码

java 复制代码
public class DeadLockDemo {

    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1) {
                try {
                    System.out.println("thread1 begin");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }
                synchronized (lock2) {
                    System.out.println("thread1 end");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (lock2) {
                try {
                    System.out.println("thread2 begin");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }
                synchronized (lock1) {
                    System.out.println("thread2 end");
                }
            }
        }).start();
    }
}

使用下面的命令输出线程信息

java 复制代码
jstack <pid>

"Thread-1" 线程名

prio=5 优先级=5

tid=0x0000028ae51d6000 线程id

nid=0x8778 线程对应的本地线程标识nid

java.lang.Thread.State: BLOCKED 线程状态

通过输出结果,可以看到有一个线程死锁,Thread-0和Thread-1在进行资源的竞争,同时也输出了资源竞争代码所在行。

相关推荐
源分享12 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
JAVA96512 天前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的
java·jvm·面试
伶俜6613 天前
鸿蒙原生应用实战(十八)ArkUI 记账本:SQLite 账单 + 图表统计 + 分类管理
jvm·sqlite·harmonyos
IronMurphy13 天前
多线程问!
java·jvm·spring
unique13 天前
AI Coding 采集方案探索
jvm·人工智能·oracle
cfm_291413 天前
JVM GC日志解析
jvm
不良使14 天前
鸿蒙PC迁移:使用Electron`logseq-master-ohos` 鸿蒙适配全记录
jvm·electron·harmonyos
cfm_291414 天前
JVM深度详解:Class常量池、运行时常量池、字符串常量池、包装类对象池
java·jvm
JAVA96514 天前
JAVA面试-JVM篇 02-G1垃圾收集器的工作原理是什么与CMS的区别
java·jvm·面试