Java死锁排查

Java 死锁排查与解决:从原理到实战 死锁是指两个或多个线程相互持有对方需要的资源,导致所有线程都无法继续执行下去的状态。想象一下,有两个人在狭窄的过道里相遇,彼此挡住了对方的路,谁也不肯让步,最终谁也无法通过。资源必须处于独占模式,即一次只能被一个线程占用。线程已经占有至少一个资源,但同时还在请求其他线程占有的资源。线程已经获得的资源,在未使用完之前,不能被其他线程强行剥夺。存在一个线程的循环等待链,例如:线程 A 等待线程 B 释放资源,线程 B 等待线程 C 释放资源,线程 C 等待线程 A 释放资源。 阅读详情

简介

本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多;第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力。

Java死锁排查

通过标题我们就要思考
怎么排查代码中出现了死锁?
作为技术人员(工程师),在面对问题的时候,可能需要的能力是怎么去解决这个问题。但是在学习技术知识的时候,那就要多问为什么,一定要锻炼自己这方面的能力,这样才能更好的掌握知识。

解答:
什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。百度百科:死锁

注:进程和线程都可以发生死锁,只要满足死锁的条件!

为什么会出现死锁?
从上面的概念中我们知道
(1)必须是两个或者两个以上进程(线程)
(2)必须有竞争资源

怎么排查代码中出现了死锁?【重点来了】
首先写一个死锁的代码,看例子:

/**
 * 
 * 使用jstack 排查死锁
 * @author dufyun
 *
 */
public class JStackDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new DeadLockTest(true));//建立一个线程
        Thread t2 = new Thread(new DeadLockTest(false));//建立另一个线程
        t1.setName("thread-dufy-1");
        t2.setName("thread-dufy-2");
        t1.start();//启动一个线程
        t2.start();//启动另一个线程
    }
}
class DeadLockTest implements Runnable {
    public boolean falg;// 控制线程
    DeadLockTest(boolean falg) {
        this.falg = falg;
    }
    public void run() {
        /**
         * 如果falg的值为true则调用t1线程
         */
        if (falg) {
            while (true) {
                synchronized (Demo.o1) {
                    System.out.println("o1 " + Thread.currentThread().getName());
                    synchronized (Demo.o2) {
                        System.out.println("o2 " + Thread.currentThread().getName());
                    }
                }
            }
        }
        /**
         * 如果falg的值为false则调用t2线程
         */
        else {
            while (true) {
                synchronized (Demo.o2) {
                    System.out.println("o2 " + Thread.currentThread().getName());
                    synchronized (Demo.o1) {
                        System.out.println("o1 " + Thread.currentThread().getName());
                    }
                }
            }
        }
    }
}

class Demo {
    static Object o1 = new Object();
    static Object o2 = new Object();
}

上面这段代码执行后,就会出现死锁,那么排查的方法有如下:

使用 jps + jstack查找死锁原因

使用 jps + jstack找到卡死的项目进程ID

# jps
12564 RemoteMavenServer
740 JStackDemo
10312 Launcher
10712 Jps
7400

使用jstack打印该进程的线程栈信息

C:\Users\dell\Desktop
# jstack  -l 740

通过线程栈的日志信息可以找到死锁信息的提示如下:

Found one Java-level deadlock:
=============================
"thread-dufy-2":
  waiting to lock monitor 0x000000001ca636e8 (object 0x000000076c695d10, a java.lang.Object),
  which is held by "thread-dufy-1"
"thread-dufy-1":
  waiting to lock monitor 0x000000001ca622f8 (object 0x000000076c695d20, a java.lang.Object),
  which is held by "thread-dufy-2"

使用jconsole查找

在window打开 JConsole,JConsole是一个图形化的监控工具!
在windons命令窗口 ,输出 JConsole即可打开该界面

# JConsole

选择要连接的线程,点击链接,这里直接选择不安全的连接即可
在这里插入图片描述
链接后的图如下,选择线程面板,点击检测死锁
在这里插入图片描述
它就会弹出检测到的死锁线程名称如下图;

在这里插入图片描述

使用Java Visual VM检测

在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!
在windons命令窗口 ,输出 jvisualvm直接就打开了图形界面

  # jvisualvm

在这里插入图片描述
双击左侧的启动类名称,如下图即可看到可视化的线程检测结果,红色部分即死锁线程
在这里插入图片描述

压力测试使用jstack找到系统的代码性能问题

1、在进行压力测试的时候,使用jps找到应用的PID
2、然后使用jstack输出出压力测试时候应用的dump信息
3、分析输出的日志文件中那个方法block线程占用最多,这里可能是性能有问题,找到对应的代码分析

推荐一个脚本工具

show-busy-java-threads

详情看github中讲解!我自己下载了show-busy-java-threads!

安装和使用:
下载 show-busy-java-threads
上传服务器,然后进行解压
解压后
然后执行对应的命令

作者:阿飞云
来源:优快云
原文:https://blog.youkuaiyun.com/u010648555/article/details/80721815
版权声明:本文为博主原创文章,转载请附上博文链接!

GD32F103程序烧录全攻略:从SWD到串口的实战指南 本文提供了GD32F103微控制器程序烧录的全面实战指南,详细介绍了SWD、JTAG和串口(ISP)三种主流下载方式。文章重点解析了在Keil MDK中使用ST-Link进行SWD下载的完整步骤,包括硬件连接、软件配置和Flash算法设置,并针对烧录过程中的常见问题提供了实用的排坑解决方案,帮助开发者高效完成程序部署。 阅读详情

相关推荐

如何利用DeepSeek自动生成PLC程序?

在工业自动化领域,PLC是核心控制设备,其编程效率和质量直接影响生产线的运行效果。 然而,传统PLC编程依赖工程师手动编写代码,不仅耗时耗力,还容易出错。通过自动生成PLC程序,DeepSeek不仅大幅提升了编程效率,还优化了代码质量。 那么DeepSeek到底能否自动生成PLC程序呢? 有位电气工程师就尝试让DeepSeek设计一套五层电梯控制系统的PLC程序,下面就让我们看看吧。 技术原理:DeepSeek如何实现自动编程DeepSeek利用自然语言处理技术,将工程师输入的文本指令转换为PLC代码。例

Qinmingyue13的博客 6172

Java中的死锁及其解决方案

Java中的死锁相关问题,不同方式手写死锁及其解决方案

weixin_45936627的博客 7800

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第七讲)

默认是第一种键盘模式,当需要切换模式,进入到ta_event_cb函数修改模式,下面代码以数字模式举例子lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER);在该界面中可以设置键盘文字的大小和文本类型,最下方判断键盘是否支持中文输入(中文输入,当汉字库不够大时,用户点击中文输入会少很多字)。//当LV_USE_KEYBOARD为1时启用虚拟键盘,LV_USE_ZH_KEYBOARD为1时支持中文输入。随后在系统设置界面中点击项目选项,选择显示键盘。

weixin_38828382的博客 1413

Java中的死锁

Java中的死锁

QYgujingjing的专栏 1112

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5756

stm32最小系统_完成一个最小FOC矢量控制系统所需的基本模块和功能配置

当我们读懂 FOC 矢量控制的基本原理之后,便迫不及待的想动手尝试,去实现一个矢量控制系统,让电机先转起来,有一个直观的感受。因此,我们需要设计实现一个矢量控制的最小系统,具备矢量控制的基本功能,满足电机矢量运行的基本条件。首先,看一下矢量控制的基本架构:矢量控制架构如上图所描述,矢量控制系统包括实时电流的采集、clarke 变换、park 变换、SVPWM 、实时角度的反馈和计算以及电流环和速...

weixin_39524048的博客 1782

JAVA——死锁详解

死锁

lzhNox的博客 4226

vTestStudio保姆教程之从0到1搭建软件环境

学习HIL测试的必经之路,保姆级教学VT从搭建到测试。

欢迎来到eee的博客 4183

java死锁如何排查

java死锁排查 jconsole jps,jps -l,jstark

yuec1998的博客 2220

快速傅里叶变换(FFT)的汇编实现在DSP开发中

在数字信号处理(Digital Signal Processing,DSP)开发中,使用汇编语言实现FFT可以进一步提高计算性能和优化系统资源的使用。FFT是一种分治算法,它通过将一个长度为N的离散时间域序列分解为多个长度为N/2的子序列,然后递归地进行计算。开发者可以根据实际需求,结合具体的硬件平台和编译器工具链,对FFT的汇编实现进行优化和定制化。需要注意的是,上述示例代码中只给出了FFT的基本框架,具体的合并操作及其他细节需要根据实际需求进行实现。上述示例代码演示了一个简单的FFT汇编实现。

QoTypescript的博客 683

使用机器学习算法预测黄金价格

在本文中,我们将使用线性回归、XGBoost和LSTM这三种不同的机器学习算法来预测黄金价格。接下来,我们使用线性回归、XGBoost和LSTM分别建立了模型,并进行了训练和预测。这些机器学习算法可以帮助我们对黄金价格进行预测,但请注意,市场价格受多种因素影响,因此预测结果可能并不完全准确。接下来,我们需要对数据进行一些预处理,以便用于机器学习模型的训练和测试。我们将使用80%的数据作为训练集,20%的数据作为测试集。最后,我们将绘制每个模型的预测结果,并将其与实际价格进行比较,以评估模型的性能。

QromMatlab的博客 1316

生产者/消费者代码(使用notify和wait实现)

package cn.wzy.Lock; import java.util.Random; public class ConsumerAndProducer { static String[] food = new String[5]; static String take() throws InterruptedException { synchronized (food) {...

qq_38089964的博客 626

关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本

如何将它翻译成matlab可以使用的矩阵变量,并参与运算。 由于这个大型刚度矩阵125万x125万≈1e12。matlab甚至其他计算软件无法保存这个大的一个矩阵文件。而这个刚度矩阵作为稀疏矩阵其中非零元素的数目只有有500多万。采用sparse稀疏矩阵技术是可以保存。 这里简单介绍一下这个Hypemesh导出的大型刚度矩阵txt文本。如图DMIG开头的标识符是换行符,后面两列是表示这条非零元素在刚度矩阵中列数的信息。我们已经将左边字母和符号等批量删除,得到了右边textread函数可以...

wenyusuran的专栏 1795

Java中死锁问题怎么排查

【代码】Java中死锁问题怎么排查。

牛马baby的博客 963

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 死锁如何排查_java死锁排查

废话不多说,直接看下面死锁代码,这是一个典型的死锁,线程1拿到A锁获取B锁,线程2拿到B锁获取A锁public class DeadLockTest{private static Object A = new Object(), B = new Object();public static void main(String[] args){new Thread(() -> {System.o...

weixin_31230841的博客 1248

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据库死锁和Java代码中死锁的举例和排查

开始事务A并更新id为1的行数据:此时,事务A和事务B都尝试更新同一行数据,导致它们相互等待对方释放锁,从而产生死锁。

猪猪 2715

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java线程死锁问题怎么排查

监控与初步判断:通过监控工具观察线程状态和系统响应情况;采集线程 dump:使用 jstack 或其他工具生成线程转储;分析线程转储:利用死锁检测信息、调用栈和专用工具定位死锁原因;代码和设计审查:检查并发代码的锁使用和同步逻辑,确保锁的顺序一致;预防与监控:采用程序检测、定期采集线程 dump 和报警机制预防死锁的发生。通过系统化的排查流程,结合工具分析和代码优化,可以有效定位和解决 Java 线程死锁问题。

longgelaile的博客 1323

Java排查——死锁

Java排查之死锁

m0_67692587的博客 784

Java中死锁问题怎么排查?

通过工具可视化线程-锁依赖关系后,结合代码逻辑调整同步策略即可解决。预防胜于治疗,良好的并发设计能彻底避免死锁风险。你想要的技术资料我全都有:https://pan.q删掉汉子uark.cn/s/aa7f2473c65b。

牛马baby的博客 1175

Java如何排查死锁

面试问到了死锁相关问题,关于死锁排查这块没有动过手,算是盲区,现在动手尝试并记录一下。 什么是死锁 死锁是指多个进程之间因为资源竞争,导致进入一种僵持的状态,没有外力就不能继续执行的问题。 死锁必要条件 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。 占有和等待:已经得到了某个资源的进程可以再请求新的资源。 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

weixin_42366358的博客 999

java 死锁排查

java 服务死锁排查原因,报错解析,处理死锁

zhangsan1388的博客 437

如何排查定位java中的死锁

如何排查定位java中的死锁

卓越之识论道,平常之识论事,狭隘之识论人 1695

Java死锁问题排查解决

使用 Java VisualVM(简称 VisualVM)排查线上死锁是一个常见的实践,因为它提供了丰富的图形化界面,便于实时监控和诊断 Java 应用的运行情况。如果存在死锁,jstack 会在输出的末尾部分显示死锁相关的信息,包括哪些线程涉及以及它们正在等待哪些锁。使用线程转储(Thread Dump)线程转储 是诊断 Java 死锁的常用方法,可以查看所有线程的状态及其持有的锁信息。死锁,简单来说就是两个或者两个以上的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。

刘皇叔说Java的博客 1766

java排查死锁_Java死锁的排查和解决方案

相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。今天小编一次性来帮助大家解决Java死锁的有关问题。1、为什么会出现死锁?要解决Java死锁就必须追根究底,为什么会出现死锁?其实从死锁的定义就可以看出来,一方面是因为有两个或者两个以上进程,另一方面是因为有竞争资源。2、...

weixin_36155560的博客 629

如何排查Java应用的死锁

排查Java应用的死锁涉及理解死锁概念、获取并分析线程转储、使用专业工具,以及采用预防死锁的最佳实践。- 手动分析:如果没有显式的死锁报告,你需要手动分析线程转储。查找BLOCKED状态的线程,并检查它们在等待的资源以及持有这些资源的线程。2. 持有并等待:一个线程持有至少一个资源,并且正在等待获取额外的资源,而这些资源被其他线程持有。4. 环路等待:存在一个线程的环路链,其中每个线程都在等待一个被下一个线程持有的资源。- JProfiler:商业化的Java分析工具,提供了详细的线程分析和死锁检测功能。

ruky36的专栏 997

Java死锁问题如何排查?

Java死锁问题如何排查?

java1234的博客 1179
上一篇: Java应用CPU占用100%原因分析
下一篇: Docker-compose
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值