4个java死锁工具:jstack、jconsole、jvisualvm、jmc

2023-11-07

在 Java 中,死锁(Deadlock)情况是指:两个或两个以上的线程持有不同系统资源的锁,线程彼此都等待获取对方的锁来完成自己的任务,但是没有让出自己持有的锁,线程就会无休止等待下去。线程竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。

在程序执行的时候,难免会遇到死锁的情况。

下面介绍一下如何排查Java中的死锁线程。


先来个死锁的例子:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDeadLock {
    static Lock lock1 = new ReentrantLock();
    static Lock lock2 = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new DeadLockDemo(lock1, lock2), "Thread1");
        Thread thread2 = new Thread(new DeadLockDemo(lock2, lock1), "Thread2");
        thread1.start();
        thread2.start();
    }

    static class DeadLockDemo implements Runnable {
        Lock lockA;
        Lock lockB;

        public DeadLockDemo(Lock lockA, Lock lockB) {
            this.lockA = lockA;
            this.lockB = lockB;
        }

        @Override
        public void run() {
            try {
                lockA.lock();
                System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "\t 尝试获得:" + lockB);
                TimeUnit.SECONDS.sleep(2);
                lockB.lock();
                System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "\t 尝试获得:" + lockA);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lockA.unlock();
                lockB.unlock();
                System.out.println(Thread.currentThread().getName() + "正常结束!");
            }
        }
    }
}

执行该类,可以明显看到,程序不会自动结束,说明还有线程占用资源或者等待资源

首先使用 jps 命令列出当前的Java进程:

下面使用一些工具进行抓取死锁的线程。

1、jstack

找到疑似死锁的例子,找到 PID,上图中可以看到 20148 线程是我上面执行死锁的例子:

> jstack -l 20148
20148 com.yudianxx.basic.线程.ReentrantLock.ReentrantLockDeadLock

jps -l ; -l 参数可以显示完整的启动类

执行 jstack -l 20148

往下找,会显示一段 deadlock 的关键字:

再看到下面,提示:

at com.yudianxx.basic.线程.ReentrantLock.ReentrantLockDeadLock$DeadLockDemo.run(ReentrantLockDeadLock.java:39)

即可定位到死锁的类和行数。

2、jconsole

jconsole 位于 JDK 的 bin 目录,双击即可运行。

如下,选择需要建立连接的进程。

切换到 线程,再点击下方的 检测死锁 ,即可查看死锁的情况:

除此之外,jconsole 还可以查看堆内存、CPU、线程数 等其他信息。

3、jvisualvm

jvisualvm 也在 JDK 的 bin 目录。

选择本地的进程,上方切换至 线程 ,再点击一下 线程Dump 即可。

点击后可以看到线程的状态日志,可以看到死锁的信息:

4、jmc

同样位于 JDK 的 bin 目录。

打开你需要监测的进程:

下方切换到 线程

图中看到的就是死锁的标识。


以上就是定位java线程死锁的工具,推荐使用 jstack 命令,毕竟后三个工具在Linux中是没有的。

jstack 通过找到类入口,再找出当前线程正在等待哪个线程,然后再定位到死锁的行数。

参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4个java死锁工具:jstack、jconsole、jvisualvm、jmc 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • MFC的SendMessage与PostMessage的区别

    一 SendMessage 同步操作 SendMessage 是一个同步函数 它会将消息发送到指定的窗口 并等待该窗口的消息处理过程完成 然后返回 这意味着它会阻塞当前线程 直到消息处理完成 直接调用 SendMessage 会将消息直接传
  • 图论5(Leetcode1376.通知所有员工所需的时间)

    答案 这是官方答案 我写的超时了 我不会树结构的存储 这里用了Map 学到了 class Solution public int numOfMinutes int n int headID int manager int informTim
  • 【Flutter】【package】pin_code_fields 漂亮的验证码输入框

    文章目录 前言 一 pin code fields 是什么 二 使用步骤 1 引入库 2 使用 1 基础功能 2 基础参数功能解析 3 部分功能的特殊说明 1 键盘右下角的功能按键样式 2 inputFormatters 输入内容的检验和限
  • WEB信息收集

    责任声明 本文章仅供学习交流使用 如有利用进行非法行为 上传者不承担任何责任 使用者后果自负 目录 一 域名收集 利用whois 阿里云 站长之家 全球查询 IP138网站 ICANN LOOKIUP 爱站网 VirusTotal 二 备案
  • python 抛出异常与自定义异常raise

    使用raise抛出异常 当程序出现错误 python会自动引发异常 也可以通过raise显示地引发异常 一旦执行了raise语句 raise后面的语句将不能执行 演示raise用法 1 2 3 4 5 6
  • 计算机网络_01_基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 网络分层 分层的好处 各层次之间是独立的 某一层并不需要知道它的下一
  • 【C语言初级阶段学习1】使用vscode运行C语言,vscode配置环境超详细过程(包括安装vscode和MinGW-W64安装及后续配置使用的详细过程,vscode用户代码片段的使用)[考研专用]

    vscode配置c语言环境 前言 一 下载vscode和MinGW W64和安装过程 1 vscode部分 1 1 vscode下载安装过程 1 2 vscode下载插件 2 MinGW W64部分 2 1 MinGW W64下载安装过程
  • 【虚幻】清理缓存文件(C盘占用过大)

    使用UE4时 引擎的默认编译文件保存在C盘 久了会使C盘爆满 这样子 我们需要先清理调C盘现有的缓存文件 然后修改一下缓存路径 一 清理C盘缓存 缓存文件位置C Users 用户名 AppData Local UnrealEngine Co
  • pygame无法在屏幕上显示中文(已解决)

    方法1 用系统自己带的字体 C Windows Fonts里面查看 然后 front pygame front SysFront simHei 50 字体大小是50 一般不需要输入文件路径 text 青铜 文字内容 render12 fro
  • pymysql fetchone () , fetchall () , fetchmany ()用法与区别

    1 定义 1 1 fetchone 返回单个的元组 也就是一条记录 row 如果没有结果 则返回 None 1 2 fetchall 返回多个元组 即返回多个记录 rows 如果没有结果 则返回 首先 fetchone 函数它的返回值是单个
  • React基础-生命周期

    1 引出生命周期 unmountComponentAtNode 卸载组件 componentDidMount 组件挂载完毕 componentWillReceiveProps 组件将要接受参数 子组件将要接受新参数时触发的生命周期函数 sh
  • 【JavaWeb】练习五

    1 gt 过滤器实现登录过滤 WebFilter urlPatterns do initParams WebInitParam name driver value com mysql jdbc Driver public class Log
  • Springboot 拦截器,拦截所有请求,判断是否登录,验证权限

    Java的三大器 拦截器的作用 Java里的拦截器是动态拦截Action调用的对象 它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码 也可以在一个Action执行前阻止其执行 同时也提供了一种可以提取Action中可重用
  • libevent 事件循环

    include
  • Dubbo zookeeper 初探

    原文地址 http blog csdn net wxwzy738 article details 16330383 转 http blog csdn net u011270461 article details 12144623 建议参考资
  • 信息隐藏技术--图像置乱

    图像置乱 图像置乱是信息隐藏技术的一种 图像置乱后图像无法辨认 可以达到对图像信息的隐藏和保护作用 分类 空域置乱 频域置乱 空频域混合置乱 图像置乱对信息起到了隐藏和保护的作用 既可以对信息进行加密传送 也可以作为图像处理的预处理 图像置
  • Spring系列文章:Bean的获取⽅式

    一 简介 Spring为Bean提供了多种实例化 式 通常包括4种 式 也就是说在Spring中为Bean对象的创建准 备了多种 案 的是 更加灵活 第 种 通过构造 法实例化 第 种 通过简单 模式实例化 第三种 通过factory be
  • ffmpeg中sws_scale()用法实例

    ffmpeg中sws scale 用法实例 视频编码 2009 06 30 10 02 27 阅读1185 评论0 字号 大 中 小 订阅 Copyright C 2003 Michael Niedermayer
  • vue 表单相互校验

    这里举例校验姓和名的长度和不少于3
  • 4个java死锁工具:jstack、jconsole、jvisualvm、jmc

    在 Java 中 死锁 Deadlock 情况是指 两个或两个以上的线程持有不同系统资源的锁 线程彼此都等待获取对方的锁来完成自己的任务 但是没有让出自己持有的锁 线程就会无休止等待下去 线程竞争的资源可以是 锁 网络连接 通知事件 磁盘