Java服务导致CPU爆表异常排查

一、前言

之前的博客有提到过面对Tomcat部署的java服务出现内存溢出该如何定位,今天来记录下Tomcat部署的java服务出现CPU爆表的事故该如何定位。

二、正文

针对Linux系统在处理CPU爆满时会有相关指令可以一步到位,相关资料度娘有很多。本文重点以Windows系统记录排查过程。

1、通过系统自带的资源管理器找到java服务,查看PID

Java服务导致CPU爆表异常排查_第1张图片

2、通过指令导出该进程快照

jstack -l 11240 > c:/11240.stack
Java服务导致CPU爆表异常排查_第2张图片

由于生成的stack文件只会记录进程相关信息,如果我们需要定位线程占用率则需要小工具

3、下载线程CPU分析工具

下载地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

解压后打开工具,找到Java服务,右键properties在弹出框中选中Threads列表

Java服务导致CPU爆表异常排查_第3张图片

此时就是Java服务中各个线程占用CPU的情况,我们按照CPU响应时间排序,就可以找到最耗时的某个线程。复制它的TID。

4、将第三部复制的TID转换为十六进制

例如我们找到了TID为:9928,通过计算器得知十六进制为26C8

Java服务导致CPU爆表异常排查_第4张图片

5、然后我们用文本格式打开第一步导出的STACK文件,在里面查找TID为26C8的相关信息,此时我们可以定位到是在该行代码执行过程中疯狂占用CPU。

Java服务导致CPU爆表异常排查_第5张图片

6、然后我们通过查看代码,定位具体原因进行修改

Java服务导致CPU爆表异常排查_第6张图片

上图没有形成逻辑闭环导致成为死循环,疯狂消耗CPU致使爆表。

三、总结

关于Windows系统的Tomcat下CPU爆表排查就介绍完了,过程相对还是比较简单,按照步骤执行一次就可以学会的,

你可能感兴趣的:(Java,java,ProcessExplorer)