背景:线上服务器CPU飙高,如何找到相关应用,如何定位问题代码。
介绍jstack利器
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
步骤一、找到最耗CPU的进程
工具
工具top
方法
步骤二、找到最耗CPU的线程
工具
工具top
方法
top -Hp xxx,显示一个进程的线程运行信息列表(xxx是上面查出来的进程PID)
图示

如上图,进程4384内,最耗CPU的线程PID为4385
步骤三、线程PID转为16进制
工具
工具:printf 或者 程序计算器
方法
方法:printf “%x\n” 4385
图示

注:为啥转为16进制。因为堆栈里,线程id是用16进制表示的。
步骤四、查看堆栈,找到最耗CPU的线程在干嘛
工具
pstack/jstack/grep
方法
jstack 4384 | grep 1211
打印进程堆栈
通过线程id,过滤得到线程堆栈
图示

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