一文学会Java死锁和CPU 100% 问题的排查技巧

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开工欲善其事,必先利其器之前整理过一篇文章,本篇是对那篇的优化:Java死锁排查和Java CPU 100% 排查的步骤整理和OOM FullGc案例文章目录00 本文简介01 Java死锁排查和解决啥是死锁?为啥子会出现死锁?怎么排查代码中出现了死锁?【重点来了】1、使用 jps + jstack2、使用jcons…

大家好,又见面了,我是全栈君。

做一个积极的人

编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开

工欲善其事,必先利其器

00 本文简介

作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过:

第一个问题:Java死锁如何排查和解决?

第二个问题:服务器CPU占用率高达到100%排查和解决?

第三个问题:有哪些工具能够快速查看线程使用情况?

本文对这三个问题进行总结整理,通过实例演示讲解,精彩干货,不容错过啊!

前戏就这么多,高潮会很多,做好了,让我们直奔主题,发动小船,Let’s go!

小船

01 Java死锁排查和解决

要排查和解决死锁,首先思考三个问题:

1. 什么是死锁?

2. 为什么会出现死锁?

3. 怎么排查代码中出现了死锁?

4. 如何避免写出死锁的代码?

作为技术人员(工程师),在出现问题的时候,能够尽快的去解决这个问题。但是在学习技术知识的时候,还是脚踏实地,多问一些为什么,一个好的问题,能够让自己思考,这方面的能力也一定要锻炼锻炼哦,这样才能更好的理解和掌握知识,并探究/触碰到更深入的地方。

1、啥是死锁?

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

死锁图示

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

2、为啥子会出现死锁?

从上面的概念中我们知道

(1)必须是两个或者两个以上进程(线程)

(2)必须有竞争资源

3、怎么排查代码中出现了死锁?【重点来了】

首先整一个死锁的代码,看例子:

死锁小demo

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

第一个姿势:使用 jps + jstack

:在windons命令窗口,使用jps -l【不会使用jps请自行查询资料】

jps -l 命令

:使用 jstack -l 12316 【不会使用jstack请自行查询资料】

jstack

第二个姿势:使用jconsole

在window打开 JConsole,JConsole是一个图形化的监控工具!

:在windons命令窗口 ,输出 JConsole,如下图:

这里写图片描述

:选择到线程的tab上,如下截图。

这里写图片描述

第三个姿势:使用Java Visual VM

在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!

:在windons命令窗口 ,输出 jvisualvm

Java Visual VM

:依然是切换到线程这个TAB上,很明显的就有提示!

死锁检测

4、如何避免死锁?

上面说了死锁出现的原因以及通过三种方式来检测和排查死锁,下面更重要的东西来了,就是如何避免死锁,如果能够让写出的代码避免死锁出现也就没有上面这些排查的过程了。最好的是从源头控制问题,而不是后期遇到问题在去填坑。

我看了阿里巴巴中最新的开发规约,里面有对避免死锁的说明,具体如下:


【强制】对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会
造成死锁。
说明:线程一需要对表 A、B、C 依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序也必须是
A、B、C,否则可能出现死锁。


02、Java CPU 100% 排查技巧

第一个姿势,步骤有点多,难度四星

平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。

、 使用top命令查看cpu占用资源较高的PID

top命令

当前占用cup100% 的PID为3455。

、通过jps找到当前用户下的java程序PID

这步可省略,主要是通过jps知道是那个JAVA服务的PID

执行jps -l能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID!!!就知道是哪一个服务了。知道了对应的服务,在接着后续的分析步骤。

、 使用 pidstat -p < PID > 1 3 -u -t

如果这个命令 pidstat不可用,这步可使用 top -H -p pid 查询进程下线程信息

-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

简单安装和使用过程:

  1. 下载 show-busy-java-threads
  2. 上传服务器,然后进行解压
  3. 然后执行对应的命令

这里写图片描述

:阿里开源的问题定位神器 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编程技术乐园:一个分享编程知识的公众号。跟着老司机一起学习干货技术知识,每天进步一点点,让小的积累,带来大的改变!


扫描关注,后台回复【资源】,获取珍藏干货! 99.9%的伙伴都很喜欢

image.png | center| 747x519


© 每天都在变得更好的阿飞云

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120942.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配

    Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配AndroidAutoSize框架 1.链接https://github.com/JessYanCoding/AndroidAutoSize 2.使用 2.1.添加Gradle配置implementation’me.jessyan:autosize:1.1.2′  2.2.添加AndroidManifest配置&lt;manifest&gt;…

    2022年6月4日
    47
  • 指针函数和函数指针「建议收藏」

    指针函数和函数指针「建议收藏」概述指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。指针函数指针函数:顾名思义,它的本质是一个函数…

    2022年6月22日
    32
  • 最小二乘法简明推导过程

    最小二乘法简明推导过程最小二乘法推导最小二乘法公式J(θ)=1m∑i=1m(y(i)−hθ(x(i)))2J(\theta)=\frac1m\sum_{i=1}^m(y^{(i)}-h_{\theta}(x^{(i)}))^2J(θ)=m1​i=1∑m​(y(i)−hθ​(x(i)))2证明1.假设设数据中未被考虑进来的特征和人为无法控制的噪声为ε\varepsilonε。即y(i)=θTx(i)…

    2022年5月13日
    68
  • 局域网内不同网段的设备互相连接设置

    局域网内不同网段的设备互相连接设置这个问题是我在实际中遇到的,如下图所示,我的主机有一个公司内网的IP,可以自动获取,也可以设置固定IP,不管怎么样,网段是172.16.0.xxx,不同的部分只是这里的xxx,我的主机IP是172.16.0.83。但是有时候,我们会从别的地方拿过来一块开发板,而开发板内部的IP基本是写死的,假如这个IP是192.168.253.10,我们会使用一个交换机,然后把外网引进来,而我…

    2025年10月26日
    3
  • html背景图片如何自动平铺,html怎么设置背景图片全屏平铺?

    html背景图片如何自动平铺,html怎么设置背景图片全屏平铺?html怎么设置背景图片全屏平铺?1、新建一个html文档。2、设置一下HTML的框架,然后把图片设置在同一个文件夹里面。3、加入,这样可以有样式设置。4、因为背景设置在主体,所以还要定义为body{}。5、background-image:url(图片),这个是添加图片的意思。6、然后我们需要加入background-repeat:repeat-x;这个时候就会横向平铺。7、background…

    2022年5月15日
    67
  • 什么是一级市场二级市场三级市场四级市场_一级市场和二级市场的区别和联系

    什么是一级市场二级市场三级市场四级市场_一级市场和二级市场的区别和联系大家都经常听说一级市场与二级市场,相信也有很多人对其概念都有点模糊。而小编认为,早点理清这些概念在金融日益发达的今天是非常重要的,因此,今天就与大家简单认识一下。举个栗子隔壁老王开了个公司,没上

    2022年8月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号