使用jstack定位程序许久没有反应死锁问题

简介: 使用jstack定位程序许久没有反应死锁问题

引言

这个情况现象的程序运行的时候迟迟没有输出,我们可以怀疑的死锁的问题,但是怎么去定位这个问题呢,我们还是借助jstack来做。

jstack 163746

这个查看没有太复杂的流程,直接查看堆栈信息最后的一部分就ok

Found one Java-level deadlock:
=============================
"Thread_02":
  waiting to lock monitor 0x00002b578c002178 (object 0x000000058015e5c0, a O1),
  which is held by "Thread_01"
"Thread_01":
  waiting to lock monitor 0x00002b578c006218 (object 0x000000058015f148, a O2),
  which is held by "Thread_02"

Java stack information for the threads listed above:
===================================================
"Thread_02":
        at Demo1_3.lambda$main$1(Demo1_3.java:28)
        - waiting to lock <0x000000058015e5c0> (a O1)
        - locked <0x000000058015f148> (a O2)
        at Demo1_3$$Lambda$2/1418481495.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)
"Thread_01":
        at Demo1_3.lambda$main$0(Demo1_3.java:17)
        - waiting to lock <0x000000058015f148> (a O2)
        - locked <0x000000058015e5c0> (a O1)
        at Demo1_3$$Lambda$1/834600351.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

信息会很明确告诉有一个死锁,并且指明了代码行17行和28行,定位到这里就方便了,我们拿出源代码看看:

class O1{}
class O2{}
public class Demo1_3 {
    static O1 o1=new O1();
    static  O2 o2=new O2();
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            synchronized (o1){
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                synchronized (o2){
                    System.out.println("我是线程1,我获得了o1和o2");
                }
            }
        },"Thread_01").start();
        Thread.sleep(1000);
        
        new Thread(()->{
            synchronized (o2){
                synchronized (o1){
                    System.out.println("我是线程2,我获得了o1和o2");
                }
            }
        },"Thread_02").start();
    }
}

可以看到,线程1和2分别取锁定o1和o2,线程1在持有了o1的同时又准备去锁住o2,而线程2则先持有o2再去锁定o1,双方都没有释放,进而死锁了。

目录
相关文章
|
网络安全 网络虚拟化 数据安全/隐私保护
教程 - EasyConnect 的使用
下载和安装 自动安装组件失败,请手动 EasyConnectInstaller.exe EasyConnect下载链接 //后面的IP是服务端的IP地址,如果是域名直接在IP处填写域名 M5.0-M7.0版本: https://IP/com/install.exe M7.1之后版本: https://IP/com/EasyConnectInstaller.exe 登录异常,请下载 SSL VPN 诊断修复工具 进行修复 http://download.sangfor.com.cn/download/product/sslvpn/SangforHelperToolInstaller.exe 作
3539 0
|
分布式计算 大数据 MaxCompute
MaxCompute产品使用合集之使用pyodps读取OSS(阿里云对象存储)中的文件的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
SQL 缓存 Java
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
|
存储 缓存 关系型数据库
【如何选择Mysql服务器的CPU核数及内存大小】
【如何选择Mysql服务器的CPU核数及内存大小】
878 0
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
1552 2
【Java】服务CPU占用率100%,教你用jstack排查定位
|
存储 安全 数据安全/隐私保护
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
823 4
|
存储
Obsidian 与 Typora 图片兼容保存路径一致设置
Obsidian 与 Typora 图片兼容保存路径一致设置
1187 0
|
前端开发 开发工具 图形学
【你问我答】unity实现一个刮刮乐效果
【你问我答】unity实现一个刮刮乐效果
402 0
|
前端开发 JavaScript Java
毕业设计|课程设计|SSM开发实现图书管理系统
毕业设计|课程设计|SSM开发实现图书管理系统
272 1