java中如何排查死锁,有哪些方法

死锁代码

java 复制代码
public void threadLock() {
    Thread thread1 = new Thread(() -> {
        synchronized (resource1) {
            System.out.println(Thread.currentThread().getName() + " got resource1 lock.");
            try {
                Thread.sleep(100); // 模拟工作时间,让死锁更容易观察到
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " trying to get resource2 lock.");
            synchronized (resource2) { // 尝试获取resource2的锁
                System.out.println(Thread.currentThread().getName() + " got resource2 lock.");
            }
        }
    }, "Thread 1");

    Thread thread2 = new Thread(() -> {
        synchronized (resource2) {
            System.out.println(Thread.currentThread().getName() + " got resource2 lock.");
            try {
                Thread.sleep(100); // 模拟工作时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " trying to get resource1 lock.");
            synchronized (resource1) { // 尝试获取resource1的锁
                System.out.println(Thread.currentThread().getName() + " got resource1 lock.");
            }
        }
    }, "Thread 2");

    thread1.start();
    thread2.start();
}

1. 使用 jstack 命令

jstack 属于 JDK 自带的工具,能够打印出 Java 进程中线程的堆栈信息,从而协助发现死锁。

  • 步骤

    1. 先通过 jps 命令获取 Java 进程的 ID。
    2. 再使用 jstack <pid> 命令打印线程的堆栈信息。
    3. 查看输出结果,若存在死锁,jstack 会给出相关提示。
  • 示例

bash

yaml 复制代码
# 获取Java进程ID
jps
# 假设进程ID为1234,打印线程堆栈信息
jstack 1234

2. 使用 VisualVM 工具

VisualVM 是一个可视化的监控工具,它能查看 Java 应用程序的性能和线程信息,也能检测死锁。

  • 步骤

    1. 打开 VisualVM 工具。
    2. 选择要监控的 Java 进程。
    3. 切换到 "线程" 标签页,点击 "线程 Dump" 按钮。
    4. 若存在死锁,VisualVM 会以图形化方式展示。

3. 使用 Java Mission Control(JMC)

Java Mission Control 是一个功能强大的工具,可用于监控和分析 Java 应用程序。它能实时监控线程状态,检测死锁。

  • 步骤

    1. 打开 Java Mission Control 工具。
    2. 连接到要监控的 Java 进程。
    3. 在 "线程" 视图中查看线程状态,若存在死锁,JMC 会给出相应提示。

4. 使用 jdk自带的jconsole.exe

  • 步骤

    1. 进入到bin目录。
    2. 运行jconsole.exe。
    3. 连接到要监控的 Java 进程

5. 使用Arthas排查问题

  • 启动 Arthas: java -jar arthas-boot.jar

  • 查看总体使用情况: dashboard

可以看到已经有死锁线程了

  • 查看总体线程使用情况: thread

BLOCKED线程数量:2,并且显示了具体的BLOCKED线程

  • 定位死锁的位置: thread -b

查看死锁线程详细信息:
thread 49
thread 48

相关推荐
A-程序设计1 分钟前
基于Spring Boot+Vue的生活用品购物平台设计与实现-(源码+LW+可部署)
vue.js·spring boot·后端
k***z113 分钟前
Spring boot创建时常用的依赖
java·spring boot·后端
前端一课11 分钟前
第 32 题:Vue3 Template 编译原理(Template → AST → Transform → Codegen → Render 函数)
前端·面试
前端一课14 分钟前
第 33 题:Vue3 v-model 原理(语法糖 → props + emit → modelValue → update:modelValue)
前端·面试
前端一课18 分钟前
第 25 题:说一下 Vue3 的 keep-alive 原理?缓存是怎么做的?
前端·面试
前端一课21 分钟前
第 30 题:Vue3 自定义渲染器(Custom Renderer)原理- 为什么 Vue 能渲染到 DOM / Canvas / WebGL / 三方平台
前端·面试
前端一课21 分钟前
【vue高频面试题】第 23 题:Vue3 自定义指令(directive)完整解析
前端·面试
前端一课22 分钟前
第 28 题:Vue3 的 Diff 算法核心原理(双端 Diff、PatchFlags、Block Tree、静态提升)
前端·面试
前端一课23 分钟前
【vue高频面试题】第 21 题:Vue3 中的 Slot(插槽)— 基础、原理、使用场景、面试必问点
前端·面试
计算机毕设定制辅导-无忧学长23 分钟前
基于Spring Boot的驾校管理系统
java·spring boot·后端