jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
通过top查看当下占用cpu最多的进程Id(pid)
这里我们拿java 进程为例子 pid 22405
通过Pid查寻Tid
ps p 22405 -L -o THREAD,pid,tid,time
通过上面这条命令查询出 所有该pid 下的所有线程TID 和 时间 和cpu占用情况
USER %CPU PRI SCNT WCHAN USER SYSTEM TID PID TIME
root 0.1 19 - futex_ - - 23447 22405 00:03:09
root 0.1 19 - futex_ - - 23779 22405 00:03:13
root 0.1 19 - futex_ - - 12731 22405 00:02:33
root 0.1 19 - futex_ - - 19627 22405 00:02:15
root 0.1 19 - futex_ - - 21828 22405 00:02:11
这里我们随便选去一条线程ID 来看看 jvm 内部的堆栈情况
要查看该线程下面的堆栈必须 将 tid 转换成16进制 要不然收缩不到对应的堆栈信息
转换 16 进制 命令
printf '%x\n' 21828
然后 通过jstack 查看对应堆栈:
jstack -l 22405 |grep "0x5544" -A 10