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

做一个积极的人

编码、改bug、提升自己

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

工欲善其事,必先利其器

00 本文简介

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

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

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

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

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

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

d9f06f36b01657804fd0aa723b4450cb.gif

01 Java死锁排查和解决

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

1. 什么是死锁?

2. 为什么会出现死锁?

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

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

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

1、啥是死锁?

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

d8d2603f68e1b85c54ed60da89d3a50b.png

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

2、为啥子会出现死锁?

从上面的概念中我们知道

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

(2)必须有竞争资源

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

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

1866fc3630463c55f2e1f08c703301da.png

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

第一个姿势:使用 jps + jstack

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

1f01460da090c8f16383a1870fea1317.png

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

22c9592263f87e78430445ffbb5965cc.png

第二个姿势:使用jconsole

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

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

754092bd1d160dc84b76dbbb0cb4a1c3.png

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

b2ecbcb1d117cb806a453312e39f2f84.png

第三个姿势:使用Java Visual VM

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

一:在windons命令窗口 ,输出 jvisualvm

17da7bf4dbff83532032eb4e1940d7cb.png

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

71bba98cb20af349f935646eff25ae7c.png

4、如何避免死锁?

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

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

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

02、Java CPU 100% 排查技巧

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

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

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

f12853ef01218aa69f31706df528a02b.png

当前占用cup100% 的PID为3455。

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

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

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

-p:指定进程号

-u:默认的参数,显示各个进程的cpu使用统计

-t:显示选择任务的线程的统计信息外的额外信息

4feab4465726fc8227c30882771cf73b.png

d52a22d275f6fa5888df6796df6d22af.png

四、找到cpu占用较高的线程TID ,通过上图发现是 3467的TID占用cup较大

五、 因为jstack命令输出文件记录的线程ID是16进制。因此我们先将TID转换为十六进制的表示方式,转换方式可以参考下图。

将3467转为十六进制 d8d,注意是小写!! 记录下来,后面会使用。

889c31907d20cc48b41b334b7dc893ba.png六、通过jstack [-l] PID输出当前进程的线程信息

jstack PID /temp/test.log

七、查找 TID对应的线程(输出的线程id为十六进制),找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。

0a281478cd0f08777cfc8fcfa7b31ff0.png

找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。

PS:线程的几种状态如下说明:

NEW,未启动的。不会出现在Dump中。

RUNNABLE,在虚拟机内执行的。

BLOCKED,受阻塞并等待监视器锁。

WATING,无限期等待另一个线程执行特定操作。

TIMED_WATING,有时限的等待另一个线程的特定操作。

TERMINATED,已退出的。

第二个姿势,待开发[奸笑脸]

此处省略……,好多字。

03 推荐两个高效排查问题工具

一 :show-busy-java-threads

a6bccc90a15413b6e90f5eb3e2025ef8.png

官网地址:show-busy-java-threads: https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads

简单安装和使用过程:

上传服务器,然后进行解压

然后执行对应的命令

a66a5bff567e4c9f2f02f4e913866335.png

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

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

这个里面有很多命令,如thread 支持一键展示当前最忙的前N个线程并打印堆栈,最简单的 thread -n 10 即可将最忙碌的十个线程快照打印出来,真正高效。

e6b2fe2d5767787e99cdefb05e56632b.png

定位神器 arthas 安装过程就做介绍了,如果你还没有用过这个工具,我建议一定去用一下,说不定你会爱上它!

04 总结

本文内容比较多,基本上是手把手的教程了,希望能够对你有所帮助,也建议没有遇到类似问题的伙伴,看完之后一定要亲自去实践一下操作过程,如果没有环境可以自行想办法搞一个测试例子。还是老话:不要眼高手低,看了和做了本质上两个概念,最终收获的也一定不同。

05 彩蛋-另一个姿势

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

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

2、然后使用jstack输出出压力测试时候应用的dump信息

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

谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

愿你我在人生的路上能都变成最好的自己,能够成为一个独挡一面的人

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D版的TagView,效果很赞

在gitHub看到的&#xff0c;感觉效果不错。 看看效果&#xff1a; Demo&#xff1a;http://download.csdn.net/detail/u012808234/9426716

Nginx配置相关结构划分的技巧和禁止IP访问

Nginx配置相关结构划分的技巧原文来自&#xff1a;http://developer.51cto.com/art/201003/190953.htm Nginx配置需要一定的技巧&#xff0c;我们在不断的使用和维护中就会发现这些&#xff0c;接下来就向大家介绍下有关Nginx配置的相关技巧。我目前的Nginx配置是拆散的&#x…

5部高分学科纪录片,在家也能受益良多!

全世界只有3.14 % 的人关注了爆炸吧知识▌导读本文为同学们整理了5部高分经典学科纪录片&#xff0c;这不仅是课堂学习的补充与延伸&#xff0c;更是开拓视野、激发学习内驱力的绝佳利器。建议收藏&#xff01;&#xff08;关注视频号少年数学家&#xff0c;呈现最直观的数学&a…

ubuntun中文读书笔记

在Linux中&#xff0c;所有设备都是用文件名来表示的。Linux中只有文件和目录&#xff0c;所有的文件和目录都以倒树状结构挂载在”/”(根目录)目录下。在Linux中如果要执行以命令可以通过 # 命令名 [-选项] 参数。在命令名、选项或者参数之间都是至少要有一个空格&#xff0c;…

开发Android应用 提升性能的小技巧

前  言 2015年&#xff0c;Android OS 目前在手机操作系统的市场占有率已达59%&#xff0c;权威机构预计&#xff0c;Android市场占有率在2016年将达到63%&#xff0c;由于Android的开放性&#xff0c;未来占有率还将不断增加&#xff0c;Android的NDK支持C/C语言&#xff0c…

SQL Server 中使用 Try Catch 处理异常

1 CREATE TABLE ErrorLog(2 errNum INT,3 ErrSev NVARCHAR(1000),4 ErrState INT,5 ErrProc NVARCHAR(1000),6 ErrLine INT,7 ErrMsg NVARCHAR(2000)8 )9 10 CREATE PROCEDURE ProcErrorLog 11 AS 12 BEGIN 13 SELECT 14 ERROR_NUMBER() AS ErrNum,--返回导致运…

Hibernate 对象的三种状态

Hibernate 对象的三种状态 瞬时&#xff08;transient&#xff09;: 由new操作符创建&#xff0c;且尚未与Hibernate Session关联的对象被认定为瞬时&#xff08;Transient&#xff09;的。瞬时&#xff08;Transient&#xff09;对象不会被持久化到数据库中&#xff0c;也不会…

升级Jenkins镜像,支持.NET6.0

&#xff08;寒天催日短&#xff0c;风浪与云平&#xff09;书接上文&#xff0c;上回咱们说到了《【Blog.Core开源】完成升级.NET 6.0》&#xff0c;只是代码层面的升级&#xff0c;今天趁着周末正好把生产环境也升级下&#xff08;大家可以酌情升级哟&#xff09;。过程很简单…

女朋友来大姨妈怎么办?

1 医生的工伤怎么算&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 大风车呀吱悠悠的转&#xff01;&#xff08;via&#xff1a;草多南&#xff09;▼3 买了个丑酸奶&#xff01;▼4 和老爸讨论谈恋爱&#xff08;via&#xff1a;张子乐_&#xff0…

[转]android 获取手机GSM/CDMA信号信息

本文转自&#xff1a;http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表&#xff0c;那如何获取CDMA或者GSM的手机信号呢&#xff1f;系统提供了TelephonyManager类&#xff0c;此类非常丰富&#xff0c;基本你所…

数码管流动显示(自己的单片机)

/********************************************************************************** * 标题: 试验数码管上显示数字( 单片机直接实现位选 共阴极) * * * * …

Hibernate懒加载

在Hibernate框架中&#xff0c;当我们要访问的数据量过大时&#xff0c;明显用缓存不太合适&#xff0c; 因为内存容量有限 &#xff0c;为了减少并发量&#xff0c;减少系统资源的消耗&#xff0c;这时Hibernate用懒加载机制来弥补这种缺陷&#xff0c;但是这只是弥补而不是用…

迪拜“烧掉800亿”造了座烂尾岛,奇葩建筑惊呆网友:有钱人的世界,我不懂!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;普象工业设计小站天呐&#xff01;最新消息阿布扎比酋长国又发现220亿桶非常规可采石油让原本富有的国家更加钱上有钱尤其是它的兄弟国——迪拜简直“豪”无人性耗资800亿美元的“世界岛”惨成全球最大烂尾项目竟没有表示…

英特尔收购威盛X86业务 兆芯何去何从

日前&#xff0c;英特尔公司以1.25亿美元收购威盛麾下Centaur 公司的x86业务。Centaur 是威盛的一家子公司&#xff0c;20多年前&#xff0c;威盛依靠数笔收购获得了x86授权&#xff0c;开发了数款X86芯片&#xff0c;由于性能与英特尔和AMD差距太大&#xff0c;威盛的X86 CPU在…

.net中的mapinfo开发:准备(一)

最近开发一个项目&#xff0c;用到了mapinfo的开发&#xff0c;所以想把自己研究的一些东西记录下来&#xff0c;一则供自己使用&#xff0c;二则供一些同道中的朋友参考&#xff0c;有什么不当之处&#xff0c;请提示&#xff0c;再做修改。 首先要了解一下mapinfo的基本概念&…

研究生计划-心得征程

以前定过一个计划&#xff0c;现在觉得有必要在重新规划一次&#xff0c;毕竟见识和认识有深了 1、编译原理&#xff0c;前些天是把数据结构写完了&#xff0c;编译原理也一直没看&#xff0c;所以下一步深入学习编译原理 2、学习PHP框架&#xff0c;像wordpress和yii,PHP也算入…

java launcher 下载_Java Launcher下载并安装

通过双击资源管理器中的类文件来运行Java程序&#xff0c;并创建一个EXE和可执行的JAR文件Java启动器通过双击类文件来运行Java应用程序和小程序. 通过右键单击以图形格式查看类源代码和类层次结构&#xff1b;显示jar和zip文件的内容java下载安装&#xff0c;而不是通过右键单…

自带数据线的迷你数显充电宝,好用到哭

▲ 点击查看无论是付钱办事坐车&#xff0c;还是游戏追剧闲聊&#xff0c;有个手机就够了啊~这也就导致了&#xff0c;出门最怕的不是没带钱&#xff0c;而是带了手机却没电了。手机没电&#xff01;这简直能要了老命啊&#xff01;幸好有充电宝“续命”&#xff01;但每回在打…

值得永久收藏的 C# 设计模式套路(二)

设计模式套路&#xff0c;第二弹。在第一篇中&#xff0c;主要写了创造模式相关的几种套路。如果你是刚看到这个文章&#xff0c;建议你先去看看第一篇 传送门。这一篇&#xff0c;我们说说结构模式相关的套路。结构模式&#xff0c;主要作用是将类型、对象和其它内容放在一起&…

VmWare5.5主机Citrix桌面实施方案(二)

三、配置数据库服务器安装数据库服务器分别在三台机器上安装SQL2008运行安装程序图示3.1点击确定继续图示3.2使用全新安装图示3.3图示3.4输入密钥继续图示3.5接受条款图示3.6进行安装图示3.7图示3.8图示3.9图示3.10图示3.11图示3.12图示3.13指定启动SQL账户图示3.14指定管理员图…