记一次CPU占用过高的问题发现

作者:可爱猪猪 - 帅锅一枚
作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~
作者一直在进步,需要你们的支持和鼓励,谢谢!
人生理想:在程序猿界混出点名堂!

环境

开发机:WIN7 PC
数据库:MongoDB
运行环境:JVM
语言:JAVA
CPU:4核
应用系统:WEB应用
前端设备:1台 ,该机器与应用系统进行Socket通讯
Web容器:Jetty

现象

1.访问应用系统界面出现卡顿或者无响应,后台日志会打印Jetty的线程池申请不到资源
2.CPU资源一直在80%以上

排查思路

1.打开任务管理器,查看CPU最高的进程是JAVA
2.然后呢,肯定排查是哪些线程占用资源比较高呢?对于Linux的命名是top -Hp 进程号,但是我的环境是WIN7,搜索发现一个小工具 Process Explorer ,可以自行问度娘。这里就不发送链接和贴图。反正通过这个工具可以看到资源占用高的线程号。
3.那如何根据线程号找到对应的线程及线程到底在做什么导致资源占用如此之高呢?
是时候请出jdk的利器,jstack了,使用命令 jstack 进程号,打印出此刻的线程信息,可是里面哪里有线程号呢?如下图:


线程号.png

业界人士一看就知道0x开头明显就是十六进制,好了,分析到这里,我们赶紧拿出 Process Explorer找出的资源占用比较高的线程号换算成十六进制吧,果然转化后的十六进制轻松的从线程堆栈日志中找出对应的代码,如果找不到请重新执行一遍就stack命令。
找到对应的堆栈日志可能看到自己的代码在哪一行执行消耗CPU资源比较多。
本以为问题就此就可以排查到了,但是一波三折,占用资源较多的代码只是简单的字符串处理,也没有频繁的调用。


天呀。。。究竟是发生什么了。
放飞一下想象力吧。
然后想到会不会是硬件问题呢?
搜了一下可能CPU温度过高。
果断下载一个工具CPUTemper检测一下,我的天呀,每个核的温度都达到了100多度。原来凶手在这里。

打开机箱,重新更换了风扇。

可是问题依旧没有解决,虽然温度检测工具检测温度并没有那个高,只有60多度。

想了一下可能预热未散,关机下班,第二天,果然一切正常。

后语:当一条路走不通,那就走一条非常规的路去瞅瞅!!O(∩_∩)O哈哈~