
概述
本文介绍一次解决线上服务Java进程CPU过载问题的经过,提供了如果定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载,希望能提供后续遇到类似情况的读者一点思路。
线上环境发现的问题
测试人员在测试环境发现,机器卡顿,CPU占用率相当高。
基本解决方案
基于工具先定位具体Java线程,然后定位Java线程运行的代码块。
解决过程
线上环境使用操作系统是linux,机器需要先设置好JAVA_HOME环境变量。
1、定位Java线程所属的进程
命令:top -c
得到显示进程运行信息列表
定位得到CPU占用过高的JAVA进程的PID为11721

2、定位最耗CPU的线程
命令:top -Hp 11721
11721是进程PID,得到进程的线程运行信息列表
定位得到最耗CPU的线程PID有3个,分别是12687,12678,12555

3、把线程PID转为16进制
命令:printf "%x\n" 12687
12687是线程id
得到CPU占用最高的3个16进制的线程ID:0x318f、0x3186、0x310b

4、查看线程运行的堆栈信息
命令:jstack 11721 | grep '0x318f' -C9 --color
11721是进程PID,0x318f是线程的16进制的ID
定位得到3个运行堆栈信息,就可以定位问题代码:




网友评论