Java线上服务CPU过载问题快速定位

Java线上服务CPU过载问题快速定位_第1张图片

概述

  本文介绍一次解决线上服务Java进程CPU过载问题的经过,提供了如果定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载,希望能提供后续遇到类似情况的读者一点思路。

线上环境发现的问题

  测试人员在测试环境发现,机器卡顿,CPU占用率相当高。

基本解决方案

  基于工具先定位具体Java线程,然后定位Java线程运行的代码块

解决过程

  线上环境使用操作系统是linux,机器需要先设置好JAVA_HOME环境变量。

1、定位Java线程所属的进程

命令:top -c
得到显示进程运行信息列表
定位得到CPU占用过高的JAVA进程的PID为11721

Java线上服务CPU过载问题快速定位_第2张图片
定位进程PID

2、定位最耗CPU的线程

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

Java线上服务CPU过载问题快速定位_第3张图片
定位最耗CPU的线程

3、把线程PID转为16进制

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

计算线程ID十六进制

4、查看线程运行的堆栈信息

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

Java线上服务CPU过载问题快速定位_第4张图片
0x318f.png
Java线上服务CPU过载问题快速定位_第5张图片
0x3186.png
Java线上服务CPU过载问题快速定位_第6张图片
0x310b.png
Java线上服务CPU过载问题快速定位_第7张图片
微信图片_20180706090650.png

你可能感兴趣的:(Java线上服务CPU过载问题快速定位)