前一段时间,服务器cpu使用率达到100% 导致web网站无法访问,经过我熬夜的排查解决问题,此时想起来,将排查的方法写出来,方便没有解决过此类问题的人操作,服务器使用的是windows server 2008
1、问题出现现象,收到网站报警短信,登陆服务器,发现cpu使用率是100%,打开资源管理器,查看进程,消耗cpu的是java进程
2、开始排查,使用的工具 Process Explorer
下载地址 https://download.youkuaiyun.com/download/fengkuangshangdi/11008228
运行 Process Explorer 工具 出现如下界面,
双击要检测的进程,可看出运行中的线程,可更具cpu的使用情况排序获取此时最多cpu的tid
2、在出现cpu使用率100%时 打开cmd命令窗口运行如下命令
jstack -l 9828 > d:/java.stack 其中9828是进程PID d:/java.stack 是将文件存放的地址
得到文件如下 java.stack 文件 图片是部分内容 ,
根据 Process Explorer 可获取此时最消耗cpu的线程 tid 如上图
将tid 转换成16进制 在java.stack中搜索,发现 最消耗cpu的是 VM THread
,这一等是java的GC 造成的,于是猜想是代码中有大对象的查询
打开 java自带的 jvisualvm 工具监控GC情况,(猜测过程不写了)
办法 1、不再需要其他工具,
直接在 java.stack 文件中挨个查看线程,分析代码,( 如果 java.stack内容不大,我使用的此方法,并成功找出问题 )
办法2、此办法是我在问题解决后研究的,比第一个省力很多……
在tomcat catalina.bat最上方配置 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D://tmp/heapdump.hprof
在内存溢出时会输出堆信息 到 D://tmp/heapdump.hprof。再 使用 Eclipse Memory Analyzer工具可快速定位到导致问题的类 再结合java.stack ,可快速找到问题
Eclipse Memory Analyzer使用方法不在此赘述