JVM调优中CPU调优利器之jstack

背景:线上服务器CPU飙高,如何找到相关应用,如何定位问题代码。

介绍jstack利器

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。

步骤一、找到最耗CPU的进程

工具

工具top

方法

  • 执行top -c,显示进程运行信息列表

    图示

    image
    如上图,最耗CPU的进程PID为4384

步骤二、找到最耗CPU的线程

工具

工具top

方法

top -Hp xxx,显示一个进程的线程运行信息列表(xxx是上面查出来的进程PID)

图示

image
如上图,进程4384内,最耗CPU的线程PID为4385

步骤三、线程PID转为16进制

工具

工具:printf 或者 程序计算器

方法

方法:printf “%x\n” 4385

图示

image
注:为啥转为16进制。因为堆栈里,线程id是用16进制表示的。

步骤四、查看堆栈,找到最耗CPU的线程在干嘛

工具

pstack/jstack/grep

方法

jstack 4384 | grep 1211
打印进程堆栈
通过线程id,过滤得到线程堆栈

图示

image
如上图,找到了耗CPU高的线程对应的线程名称“main”,以及看到了该线程正在执行代码的堆栈。

分享到