一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人
编码、改bug、提升自己
我有一个乐园,面向编程,春暖花开
工欲善其事,必先利其器
00 本文简介
作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过:
第一个问题:Java死锁如何排查和解决?
第二个问题:服务器CPU占用率高达到100%排查和解决?
第三个问题:有哪些工具能够快速查看线程使用情况?
本文对这三个问题进行总结整理,通过实例演示讲解,精彩干货,不容错过啊!
前戏就这么多,高潮会很多,做好了,让我们直奔主题,发动小船,Let's go!
01 Java死锁排查和解决
要排查和解决死锁,首先思考三个问题:
1. 什么是死锁?
2. 为什么会出现死锁?
3. 怎么排查代码中出现了死锁?
4. 如何避免写出死锁的代码?
作为技术人员(工程师),在出现问题的时候,能够尽快的去解决这个问题。但是在学习技术知识的时候,还是脚踏实地,多问一些为什么,一个好的问题,能够让自己思考,这方面的能力也一定要锻炼锻炼哦,这样才能更好的理解和掌握知识,并探究/触碰到更深入的地方。
1、啥是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。[百度百科:死锁]
注:进程和线程都可以发生死锁,只要满足死锁的条件!
2、为啥子会出现死锁?
从上面的概念中我们知道
(1)必须是两个或者两个以上进程(线程)
(2)必须有竞争资源
3、怎么排查代码中出现了死锁?【重点来了】
首先整一个死锁的代码,看例子:
上面这段代码执行后,就会出现死锁,那么排查的方法有如下:
第一个姿势:使用 jps + jstack
一:在windons命令窗口,使用jps -l
【不会使用jps请自行查询资料】
二:使用 jstack -l 12316
【不会使用jstack请自行查询资料】
第二个姿势:使用jconsole
在window打开 JConsole,JConsole是一个图形化的监控工具!
一:在windons命令窗口 ,输出 JConsole
,如下图:
二:选择到线程的tab上,如下截图。
第三个姿势:使用Java Visual VM
在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!
一:在windons命令窗口 ,输出 jvisualvm
二:依然是切换到线程这个TAB上,很明显的就有提示!
4、如何避免死锁?
上面说了死锁出现的原因以及通过三种方式来检测和排查死锁,下面更重要的东西来了,就是如何避免死锁,如果能够让写出的代码避免死锁出现也就没有上面这些排查的过程了。最好的是从源头控制问题,而不是后期遇到问题在去填坑。
我看了阿里巴巴中最新的开发规约,里面有对避免死锁的说明,具体如下:
【强制】对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会 造成死锁。 说明:线程一需要对表 A、B、C 依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序也必须是 A、B、C,否则可能出现死锁。
02、Java CPU 100% 排查技巧
第一个姿势,步骤有点多,难度四星
平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。
一、 使用top
命令查看cpu占用资源较高的PID
当前占用cup100% 的PID为3455。
二、通过jps
找到当前用户下的java程序PID
执行jps -l
能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID!!!就知道是哪一个服务了。知道了对应的服务,在接着后续的分析步骤。
三、 使用 pidstat -p < PID > 1 3 -u -t
-p:指定进程号
-u:默认的参数,显示各个进程的cpu使用统计
-t:显示选择任务的线程的统计信息外的额外信息
四、找到cpu占用较高的线程TID ,通过上图发现是 3467
的TID占用cup较大
五、 因为jstack命令输出文件记录的线程ID是16进制。因此我们先将TID转换为十六进制的表示方式,转换方式可以参考下图。
将3467
转为十六进制 d8d
,注意是小写!! 记录下来,后面会使用。
六、通过
jstack [-l] PID
输出当前进程的线程信息
jstack PID /temp/test.log
七、查找 TID对应的线程(输出的线程id为十六进制),找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。
找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。
PS:线程的几种状态如下说明:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。
第二个姿势,待开发[奸笑脸]
此处省略……,好多字。
03 推荐两个高效排查问题工具
一 :show-busy-java-threads
官网地址:show-busy-java-threads: https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads
简单安装和使用过程:
- 下载 show-busy-java-threads
- 上传服务器,然后进行解压
- 然后执行对应的命令
二:阿里开源的问题定位神器 arthas
来定位问题。
官网地址:arthas :https://alibaba.github.io/arthas/index.html
这个里面有很多命令,如thread
支持一键展示当前最忙的前N个线程并打印堆栈,最简单的 thread -n 10
即可将最忙碌的十个线程快照打印出来,真正高效。
定位神器 arthas
安装过程就做介绍了,如果你还没有用过这个工具,我建议一定去用一下,说不定你会爱上它!
04 总结
本文内容比较多,基本上是手把手的教程了,希望能够对你有所帮助,也建议没有遇到类似问题的伙伴,看完之后一定要亲自去实践一下操作过程,如果没有环境可以自行想办法搞一个测试例子。还是老话:不要眼高手低,看了和做了本质上两个概念,最终收获的也一定不同。
05 彩蛋-另一个姿势
也可以通过使用jstack
找到系统的代码性能问题
1、在进行压力测试的时候,使用jps找到应用的PID
2、然后使用jstack
输出出压力测试时候应用的dump信息
3、分析输出的日志文件中那个方法block
线程占用最多,这里可能是性能有问题,找到对应的代码分析
谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!
不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!
愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人
© 每天都在变得更好的阿飞云
一文学会Java死锁和CPU 100% 问题的排查技巧的更多相关文章
- 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...
- java 程序消耗 cpu 100% 查找方法
问题原因:由于HashMap是非线程安全的,在多线程访问时,造成死循环. 查找问题方法: 1. top 找出最耗费cpu的进程号 如:27377 2. top -p 27377 -H 找出此进程下的所 ...
- 一文学会Java的交互式编程环境jshell
什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境.这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证.简单计算之类的场景下还 ...
- 一文学会Java事件机制
本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...
- java线上cpu、内存问题排查方法
一.线程 查进程中占用cpu高的线程 ps -mp xxxxx -o THREAD,tid,time | sort -rn 将线程的id从10位转到16位,可以在下面jstack中找到对应线程 输出线 ...
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- [Java] CPU 100% 原因查找解决
CPU 100%肯定是出现死锁,这个时候观察内存还是够用的,但是CPU一直100%,以下几步解决: 1. 找到进程消耗cpu最大的 $top top - :: up days, :, user, lo ...
- Java基础:一个100%会发生死锁的程序
多线程是Java工程师进阶所必须掌握的一项技能,也是面试中绕不过的一个环节,而死锁又是多线程同步失败的经典案例,对于复杂的系统,死锁是很难通过代码层面来做静态检测和排查的,所以有的面试官会从反 ...
- JAVA程序CPU 100%问题排查
做JAVA开发的同学一定遇到过的爆表问题,看这里解决 https://www.cnblogs.com/qcloud1001/p/9773947.html 本文由净地发表于云+社区专栏 记一次Ja ...
随机推荐
- 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)
原文:疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景) 本文给出了模拟竹叶.长叶草.杂乱石头.天上繁星等关键代码.使用.Net环境下C#语言,GDI+编写. 模拟竹叶 挺像的吧? ...
- PostgreSQL模式匹配的方法 LIKE等
PostgreSQL 提供了三种实现模式匹配的方法:传统 SQL 的 LIKE 操作符.SQL99 新增的 SIMILAR TO 操作符. POSIX 风格的正则表达式.另外还有一个模式匹配函数 su ...
- WPF编游戏系列 之二 图标效果
原文:WPF编游戏系列 之二 图标效果 本篇将要实现图标的两个效果:1. 显示图标标签,2. 图标模糊效果.在上一篇中提到Image没有HTML <img>的Title属性( ...
- js 动态操作元素
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 从PRISM开始学WPF(番外)共享上下文 RegionContext?
原文:从PRISM开始学WPF(番外)共享上下文 RegionContext? RegionContext共享上下文 There are a lot of scenarios where you mi ...
- Index of /android/repository
放这里了,总是记不住... https://mirrors.zzu.edu.cn/android/repository/
- mysql索引创建&查看&删除
1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...
- Android零基础入门第16节:Android用户界面开发概述
原文:Android零基础入门第16节:Android用户界面开发概述 相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流 ...
- OAUTH2 SAML2.0
OAuth2 - http://www.cnblogs.com/linianhui/p/oauth2-authorization.html SAML - wikipedia Shibboleth / ...
- 为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论
为什么要学习Go Go是未来的服务端语言— Tobias Lütke, Shopify.在过去的几年中,Golang逐步流行起来. 还有什么能比一门新语言让码农们疯狂呢? 因此,我开始学习了一段时间G ...