jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
jstack [option] pid
jstack [option] executablecore
jstack [option] [server-id@]remote-hostname-or-ip
命令行参数如下:
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。操作如下:
1.查询Java进程ID,如下图:
2.通过进程ID查询对CPU消耗最大的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD,tid,time或者top -Hp pid,我这里用第三个,如下图:
将线程ID转成16进制用于查询,使用如下命令即可实现:printf "%x\n" pid
3.使用jstack输出进程的堆栈信息,如下图: