一文学会java死锁和cpu

做一个积极的人
编码,改变bug,提升自己
我有一个天堂,以编程为主,春天开花
一个工人要想把工作做好,首先必须磨利他的工具
00 本文简介
作为的一个技术程或者说是一头攻城狮子,你必须对下面两个问题有所了解 。也许你在实际工作或面试中遇到过:
第一个问题:java死锁如何排查和解决?
第二个问题:服务器cpu占用率高达到排查和解决?
第三个问题:有哪些工具能够快速查看线程使用情况?
本文总结了这三个问题,并通过实例加以说明 。精彩干货不容错过!
前戏那么多,高潮也会很多 。干得好,我们言归正传,开船吧,我们走!
01 java死锁排查和解决
要排除故障并解决死锁,首先考虑三个问题:
1. 什么是死锁?
2. 为什么会出现死锁?
3. 怎么排查代码中出现了死锁?
4. 如何避免写出死锁的代码?
作为一个技术员(工程师),当有问题的时候,可以尽快解决 。但是在学习技术知识的时候,还是脚踏实地,多问为什么,一个好问题就能让你思考,一定要锻炼自己这方面的能力,这样才能更好的理解和掌握知识,探索/触及更深的地方 。
1、啥是死锁?
死锁是指在两个或多个进程执行过程中,由于争夺资源或相互通信而导致的阻塞现象 。没有外力,他们就无法前进 。这个时候说系统处于死锁状态或者系统出现死锁,这些一直在互相等待的进程就叫做死锁进程 。【搜索百科:死锁】
注:进程和线程都可以发生死锁,只要满足死锁的条件!
2、为啥子会出现死锁?
从以上概念,我们知道
【一文学会java死锁和cpu】(1)必须有两个或多个进程(线程)
(2)必须有竞争资源
3、怎么排查代码中出现了死锁?【重点来了】
首先,整个死锁代码,看例子:
执行上述代码后,会出现死锁,因此故障排除方法如下:
第一个姿势:使用 jpsjstack
一:在windons命令窗口,使用jps-l[如果你不用jps,请自己查资料]
二:使用jstack-l12316[如果您不能使用jstack,请自行检查信息]
第二个姿势:使用jconsole
在窗口中打开jconsole,jconsole是一个图形化的监控工具!
一:在windons命令窗口中,输出jconsole,如下所示:
二:选择线程的标签 。
第三个姿势:使用javavisualvm
在窗口中打开jvisuam,这是一个图形化的监控工具!
一:在windons命令窗口,输出jvisuam
二:仍然切换到线程的选项卡,并且有一个明显的提示!
4、如何避免死锁?
上面的
在谈了死锁的原因和三种检测和排除死锁的方法后,更重要的是如何避免死锁 。如果编写的代码能够避免死锁,就不会有这样的故障排除过程 。比较好是从源头控制问题,不要以后遇到问题就填坑 。
我看了阿里巴巴比较新的开发协议,里面有避免死锁的说明,如下:
【强制】同时锁定多个资源、数据库表和对象时,需要保持一致的锁定顺序,否则可能会发生死锁 。注意:线程1在更新之前需要依次锁定所有表a、b、c,所以线程2的锁定顺序也必须是a、b、c,否则可能会发生死锁 。
02、javacpu排查技巧
第一个姿势,步骤有点多,难度四星
平时多积累一点,这样遇到问题,求助的话就少了 。如果实际开发中遇到cpu问题,如何排除故障?如果你没有遇到这个问题,请思考10秒 。如果遇到了,这个时候可以再复习 。
一,用top命令查看高cpu消耗的pid
目前占据cup的pid是3455 。
二,通过jps找到当前用户下的java程序pid