Java应用占用CPU使用率过高的分析

如果发现Java应用的进程CPU使用率过高时,应该怎么排查吗?

定位JVM线程中哪个线程占用过高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 列出各线程状态
top -p 进程pid号 -H

Tasks: 25 total, 0 running, 25 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.4%us, 0.2%sy, 0.0%ni, 99.3%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8061476k total, 7874836k used, 186640k free, 299824k buffers
Swap: 0k total, 0k used, 0k free, 3867148k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25204 apps 20 0 5603m 2.0g 12m S 0.0 26.2 0:00.00 java


# 找出使用率高的PID,使用jstack打印出线程当前工作状态
# 线程ID为16进程表示,需要将pid转为16进程
printf '%x\n' 线程pid号

jstack 进程pid号 |grep -A 10 转换过的线程pid号