企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**这篇文档主要介绍生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,应该如何定位排查问题。** 下面给出两种系统下的排查步骤,都是一模一样的,只是命令稍有区别! * 查消耗cpu最高的进程PID * 根据PID查出消耗cpu最高的线程号 * 根据线程号查出对应的java线程,进行处理 准备一行死循环代码: ![](https://img.kancloud.cn/0d/47/0d47f3621ed770f330fb35e9901fd0a1_500x240.png) <br/> <br/> ### 一、Windows 版 <br/> #### 1.查消耗cpu最高的进程PID 我以win 10为例,截图给大家看一下,先调出PID显示项 ![](https://img.kancloud.cn/2e/e0/2ee01fff43e41ef62fd6a14be24dc550_674x657.png) 然后发现进程PID如下图所示,为4152 ![](https://img.kancloud.cn/b9/68/b96815a95f5ac1a8608d01312126879b_687x661.png) <br/> <br/> #### 2.根据PID查出消耗cpu最高的线程号 这里用到微软的工具Process Explorer v16.22,地址如下 [https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer](https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer) 如图所示 ![](https://img.kancloud.cn/57/6c/576cbfe006930351739b7f4bbcb6b57d_746x571.png) ![](https://img.kancloud.cn/bb/f5/bbf5e214980daca25099b5fa5f699798_746x492.png) 发现最耗cpu的线程的TId为4240 这是十进制的数据,转成十六进制为1090。[十进制转十六进制在线工具](https://tool.oschina.net/hexconvert/) <br/> <br/> #### 3.根据线程号查出对应的java线程,进行处理 执行命令, 根据上面的 PID 导出进程快照 ~~~ jstack -l 4152 > F:/4152.stack ~~~ 打开文件 F:/4152.stack,搜索上面转换的16 进制文字 1090,如下图所示 ![](https://img.kancloud.cn/b2/85/b285f1179cc23bf64db3ed27c08d3dce_746x352.png) 根据文件就可以看出,我们的`TestFor.java`文件第12行一直在跑,至此定位到问题 <br/> <br/> ### 二、Linux 版 #### 1.查消耗cpu最高的进程PID 执行命令 * 执行`top -c` ,显示进程运行信息列表。按下P,进程按照cpu使用率排序 如下图所示,PID为 1564 的进程耗费cpu最高 ![](https://img.kancloud.cn/89/ab/89abd89786120ad7a150b86bf823afac_746x272.png) <br/> <br/> #### 2.根据PID查出消耗cpu最高的线程号 执行命令 * `top -Hp 1564` ,显示一个进程的线程运行信息列表。按下P,进程按照cpu使用率排序 如下图所示,PID为1565的线程耗费cpu最高 ![](https://img.kancloud.cn/9e/32/9e32d524faaa076259820e262a7bc234_746x462.png) 这是十进制的数据,转成十六进制为61d。[十进制转十六进制在线工具](https://tool.oschina.net/hexconvert/) <br/> <br/> #### 3.根据线程号查出对应的java线程,进行处理 执行命令, 根据上面的 PID 导出进程快照 **ps:如果jstack 命令不能执行查看** [Linux 安装Java 开发调试工具包](https://www.kancloud.cn/fxlwj/bsdocument/2121062) ~~~ jstack -l 1564 > ./1564.stack ~~~ 然后执行,grep命令,看线程`61d`做了什么 ~~~ cat 1564.stack | grep '61d' -C 8 ~~~ 输出如下 ![](https://img.kancloud.cn/93/c8/93c859651f05e4a7c1b031709d1aaa49_746x276.png) 根据文件就可以看出,我们的`TestFor.java`文件第12行一直在跑,至此定位到问题