湛江专业官网建站,做系统网站信息检索网站,wap网,餐饮加盟什么网站建设做一个积极的人编码、改bug、提升自己我有一个乐园#xff0c;面向编程#xff0c;春暖花开工欲善其事#xff0c;必先利其器00 本文简介作为一名搞技术的程序猿或者是攻城狮#xff0c;想必你应该是对下面这两个问题有所了解#xff0c;说不定你在实际的工作或者面试就有…做一个积极的人编码、改bug、提升自己我有一个乐园面向编程春暖花开工欲善其事必先利其器00 本文简介作为一名搞技术的程序猿或者是攻城狮想必你应该是对下面这两个问题有所了解说不定你在实际的工作或者面试就有遇到过第一个问题Java死锁如何排查和解决第二个问题服务器CPU占用率高达到100%排查和解决第三个问题有哪些工具能够快速查看线程使用情况本文对这三个问题进行总结整理通过实例演示讲解精彩干货不容错过啊前戏就这么多高潮会很多做好了让我们直奔主题发动小船Lets go01 Java死锁排查和解决要排查和解决死锁首先思考三个问题1. 什么是死锁2. 为什么会出现死锁3. 怎么排查代码中出现了死锁4. 如何避免写出死锁的代码作为技术人员(工程师)在出现问题的时候能够尽快的去解决这个问题。但是在学习技术知识的时候还是脚踏实地多问一些为什么一个好的问题能够让自己思考这方面的能力也一定要锻炼锻炼哦这样才能更好的理解和掌握知识并探究/触碰到更深入的地方。1、啥是死锁死锁是指两个或两个以上的进程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁这些永远在互相等待的进程称为死锁进程。[百度百科死锁]注进程和线程都可以发生死锁只要满足死锁的条件2、为啥子会出现死锁从上面的概念中我们知道(1)必须是两个或者两个以上进程(线程)(2)必须有竞争资源3、怎么排查代码中出现了死锁【重点来了】首先整一个死锁的代码看例子上面这段代码执行后就会出现死锁那么排查的方法有如下第一个姿势使用 jps jstack一在windons命令窗口使用jps -l【不会使用jps请自行查询资料】二使用 jstack -l 12316 【不会使用jstack请自行查询资料】第二个姿势使用jconsole在window打开 JConsoleJConsole是一个图形化的监控工具一在windons命令窗口 输出 JConsole如下图二选择到线程的tab上如下截图。第三个姿势使用Java Visual VM在window打开 jvisualvmjvisualvm是一个图形化的监控工具一在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简单安装和使用过程上传服务器然后进行解压然后执行对应的命令二阿里开源的问题定位神器 arthas 来定位问题。官网地址arthas https://alibaba.github.io/arthas/index.html这个里面有很多命令如thread 支持一键展示当前最忙的前N个线程并打印堆栈最简单的 thread -n 10 即可将最忙碌的十个线程快照打印出来真正高效。定位神器 arthas 安装过程就做介绍了如果你还没有用过这个工具我建议一定去用一下说不定你会爱上它04 总结本文内容比较多基本上是手把手的教程了希望能够对你有所帮助也建议没有遇到类似问题的伙伴看完之后一定要亲自去实践一下操作过程如果没有环境可以自行想办法搞一个测试例子。还是老话不要眼高手低看了和做了本质上两个概念最终收获的也一定不同。05 彩蛋-另一个姿势也可以通过使用jstack找到系统的代码性能问题1、在进行压力测试的时候使用jps找到应用的PID2、然后使用jstack输出出压力测试时候应用的dump信息3、分析输出的日志文件中那个方法block线程占用最多这里可能是性能有问题找到对应的代码分析谢谢你的阅读如果您觉得这篇博文对你有帮助请点赞或者喜欢让更多的人看到祝你每天开心愉快不管做什么只要坚持下去就会看到不一样在路上不卑不亢!愿你我在人生的路上能都变成最好的自己能够成为一个独挡一面的人© 每天都在变得更好的阿飞云