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

概述

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

线上环境发现的问题

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

基本解决方案

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

解决过程

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

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

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

定位进程PID

2、定位最耗CPU的线程

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

定位最耗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个运行堆栈信息,就可以定位问题代码:

0x318f.png
0x3186.png
0x310b.png
微信图片_20180706090650.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容