点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

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[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线程占用最多,这里可能是性能有问题,找到对应的代码分析

新群招募

前段时间推了一个保险讲座的广告,结果很多朋友还来私聊我关于保险方面的一些建议,甚至还有要直接拷贝我目前购买方案的(感谢大家的信任)。就个人而言,之前在购买保险的时候确实做了非常多的功课,但是主要还是基于个人情况去考虑的(收入结构,家庭情况等),另外小编家里因为有癌症的家族史,所以在在购买上都会有不同的偏向性,没有具体哪一款最好,还是要多看多交流,找到最适合自己的再下手!

基于以上目的,所以建了个保险交流群。只需要添加微信:zyc_enjoy,发暗号”保险交流“,加入讨论群(纯交流,广告勿加)。同时,我还给大家准备了一份超详细的重疾产品横向对比表给大家参考!


推荐阅读

  • 装x撩m必备的16条Linux 命令,了解一下?

  • 使用 Optional 摆脱 NullPointException 的折磨

  • 史上最易懂的Kubernetes儿童插图指南

  • 要想下班早?插件少不了!

  • 微服务之旅:从 Netflix OSS 到 Istio Service Mesh

关注我,加个星标,不忘签到哦~

点一点“阅读原文”小惊喜在等你

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

  1. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  2. Java程序占用 CPU 过高怎么排查

    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...

  3. Java线上CPU内存冲高问题排查步骤

    1 引言 作为一名从事Java开发快一年的程序员,在线上经常碰到某个模块的Pod发出CPU与内存告警的问题,而这些问题会导致系统响应缓慢甚至是服务不可用.一般情况下可以通过重启或者调高Pod的资源量或 ...

  4. window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是 ...

  5. java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的.线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一 ...

  6. 猿思考系列4——一文学会java的斗转星移

    看完上一个章节,相信你已经掌握了一些思考的本领了.今天我们来聊一个新的话题.上一篇文章是一个简约的话题,希望简约而不简单.当然,如果觉得太浅了也请立刻告知猿人工厂君,可以考虑做一些调整来更好的帮助到你 ...

  7. eclipse占用内存过大_MySQL 服务占用cpu 100%,如何排查问题? (MySQL面试第七弹)...

    阅读本文大概需要 4 分钟.来自:cnblogs.com/dennyzhangdd/p/11585971.html 一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升 ...

  8. 运行php程序cpu 100%,php 应用 cpu 100% 调试方法

    找出进程占用cpu高的原因. 进程占用cpu高,一般是由于进程长时间占用cpu,又没有主动释放占用.如果想主动释放cpu,可以调用sleep.在写程序的时候,尤其要注意while 等循环的地方. 找出 ...

  9. Java死锁和Java进程Java CPU 100%排查

    三板斧:top -> top -Hp ->jstack 通过 top 命令找到 CPU 消耗最多的进程号: 通过 top -Hp 进程号 命令找到 CPU 消耗最多的线程号(列名仍然为 P ...

最新文章

  1. 英飞凌AI越野组入门教程
  2. pythondatetime_Date
  3. Java @Deprecated注解
  4. 信息学奥赛一本通(2026:【例4.12】阶乘和)
  5. Tensorflow实践:用神经网络训练分类器
  6. Shut Down(or Closing) Your Windows and Open The Unix
  7. 企业沟通工具实现高效信息化沟通模式
  8. python神经网络算法pdf_深度学习:卷积神经网络从入门到精通 PDF 原书扫描版
  9. 计算机考试怎样删除美式键盘,Win10怎么把美式键盘删除_Win10彻底删除eng美式键盘?-192路由网...
  10. 华为路由器远程登陆之ssh
  11. mindmanager2021思维导图利器有效序列号秘钥
  12. 【python】必应api获取壁纸信息+修改桌面+倒计时显示
  13. 吴恩达《深度学习》课程介绍
  14. java中的空指针异常处理
  15. 阿里云物联网Iot设备上下线状态数据流转的设置
  16. 如何绘制用户体验地图
  17. html5新增属性cookies,关于cookie的SameSite属性
  18. jvm系列 (四) ---强、软、弱、虚引用
  19. atlas mysql 安装_Atlas安装配置
  20. 有哪些十分惊艳的书值得推荐?

热门文章

  1. 新手入门LaTex遇到的问题与解决方案
  2. 性能优化 -- 优化SurfaceView的线程调用
  3. 原生JS实现拖拽进度条、滚动鼠标显示相应的内容
  4. 美业SaaS的创业分享之[策略]:用免费换流量并不是一个好主意
  5. MongoDB副本集搭建(超级详细)
  6. android,解ROM包
  7. 蓝牙beacon打造智慧停车场
  8. 如何安装联想计算机系统,联想台式电脑怎么重装系统的步骤(手把手教你简单安装系统)...
  9. 分类模型性能评价指标:混淆矩阵、F Score、ROC曲线与AUC面积、PR曲线
  10. Java生成压缩文件(zip、rar 格式)