一、前言
之前的博客有提到过面对Tomcat部署的java服务出现内存溢出该如何定位,今天来记录下Tomcat部署的java服务出现CPU爆表的事故该如何定位。
二、正文
针对Linux系统在处理CPU爆满时会有相关指令可以一步到位,相关资料度娘有很多。本文重点以Windows系统记录排查过程。
1、通过系统自带的资源管理器找到java服务,查看PID
2、通过指令导出该进程快照
jstack -l 11240 > c:/11240.stack
由于生成的stack文件只会记录进程相关信息,如果我们需要定位线程占用率则需要小工具
3、下载线程CPU分析工具
下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
解压后打开工具,找到Java服务,右键properties在弹出框中选中Threads列表
此时就是Java服务中各个线程占用CPU的情况,我们按照CPU响应时间排序,就可以找到最耗时的某个线程。复制它的TID。
4、将第三部复制的TID转换为十六进制
例如我们找到了TID为:9928,通过计算器得知十六进制为26C8
5、然后我们用文本格式打开第一步导出的STACK文件,在里面查找TID为26C8的相关信息,此时我们可以定位到是在该行代码执行过程中疯狂占用CPU。
6、然后我们通过查看代码,定位具体原因进行修改
上图没有形成逻辑闭环导致成为死循环,疯狂消耗CPU致使爆表。
三、总结
关于Windows系统的Tomcat下CPU爆表排查就介绍完了,过程相对还是比较简单,按照步骤执行一次就可以学会的,