jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:

    1. jstack [option] pid
    2. jstack [option] executablecore
    3. jstack [option] [server-id@]remote-hostname-or-ip

    命令行参数如下:

    1. -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
    2. -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

    找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。操作如下:

    1.查询Java进程ID,如下图:
    jstack - 图1
    2.通过进程ID查询对CPU消耗最大的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD,tid,time或者top -Hp pid,我这里用第三个,如下图:
    jstack - 图2
    将线程ID转成16进制用于查询,使用如下命令即可实现:
    printf "%x\n" pid
    3.使用jstack输出进程的堆栈信息,如下图:
    jstack - 图3