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

  • 时间:
  • 浏览:33
  • 来源:我爱搬资源网 - 专注共享唐朝博客活动

00 本文简介

作为一名搞技术的线程运行猿不可能 是攻城狮,想必你应该是对下面这有三个 问题图片有所了解,说不定你在实际的工作不可能 面试也有 遇到过:

第有三个 问题图片:Java死锁怎么可不都可以排查和处里?

第三个问题图片:服务器CPU占用率高达到3000%排查和处里?

第有三个 问题图片:哪些地方地方工具可不都可以快速查看线程运行使用具体情况?

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

前戏就没有 多,高潮会什么都有有,做好了,让大伙儿儿直奔主题,发动小船,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 3000% 排查技巧

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

平时多积累怎么能让 ,另有三个 在遇到问题图片的以前就少句求人的话。不可能 在实际的开发中遇到CPU 3000%问题图片,要为社 会 排查呢?不可能 你没有 遇到过你你是什么问题图片,请先我本人思考10s,不可能 你遇到过,你你是什么以前也正好可不都可以 在回顾一遍。

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

当前占用cup3000% 的PID为3455。

、通过jps找到当前用户下的java线程运行PID

执行jps -l可不都可以打印出所有的应用的PID,找到有有三个 PID和你你是什么cpu使用3000%一样的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[1]:https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads

简单安装和使用过程:

1.下载 show-busy-java-threads[2]2.上传服务器,怎么能让进行解压3.怎么能让执行对应的命令

:阿里开源的问题图片定位神器 arthas 来定位问题图片。

官网地址:arthas[3] :https://alibaba.github.io/arthas/index.html

你你是什么上边有什么都有有命令,如thread 支持一键展示当前最忙的前N个线程运行并打印堆栈,最简单的 thread -n 10 即可将最忙碌的三个线程运行快照打印出来,真正高效。

定位神器 arthas 安装过程就做介绍了,不可能 你还没有 用过你你是什么工具,我建议一定去用一下,说不定要我爱上它!

04 总结

本文内容比较多,基本上是手把手的教程了,希望可不都可以对你有所帮助,也建议没有 遇到类似于问题图片的伙伴,都看以前一定要亲自去实践一下操作过程(怎么能让 姿势光看不想是不行的),不可能 没有 环境可不都可以 自行想土办法搞有三个 测试例子。还是老话:不想眼高手低,都看和做了本质上有三个 概念,最终收获的也一定不同。

05 彩蛋-另有三个 姿势

也可不都可以 通过使用jstack找到系统的代码性能问题图片

1、在进行压力测试的以前,使用jps找到应用的PID

2、怎么能让使用jstack输出出压力测试以前应用的dump信息

3、分析输出的日志文件中那个土办法block线程运行占用最多,这里不可能 是性能有问题图片,找到对应的代码分析。

本文由

纯洁的微笑

发布在

ITPUB

,转载此文请保持文章详细性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/07/15/2416/