java应用cpu占用过高排查

in java with 0 comment

top命令得到pid


相关字段解释:

top -Hp 获取CPU占用高的线程

top -H -p 84694含义:

84694是第一步得到的进程的pid。
通过该命令可以查看该进程里面的线程的cpu占用情况。

可以看到84858的线程占cpu高达75.7%。

jstack获取jvm线程堆栈

jstack用于生成jvm当前时刻的线程快照。线程快照是当前jvm内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

#84694是导致CPU占用高的进程号
sudo jstack -F  84694 > stack.txt
#84858是导致CPU占用高的进程的线程号
cat stack.txt | grep -A 10 84858

现在已经找到了导致cpu高的线程执行的代码行,通过分析具体代码即可知道原因。就本例而言,该线程正在等待写锁,说明是IO压力导致的CPU高,可以进一步通过iostat分析验证。