jstack命令行功能附着到指定的进程或者core文件上面打印所有附着到VM上面的线程的堆栈,包括Java线程和VM内部线程以及可选的本地栈帧,该功能也能够执行死锁检测。
该功能也能够用jsadebugd后台进程查询远程机器上面的进程或者core文件。需要注意这种情况下的输出打印非常长。
全部线程的堆栈信息对诊断许多问题都有用,例如死锁或者悬挂。
-l 选项指示该功能去查找堆中可拥有的同步块并且打印java.util.concurrent.locks的信息。没有这个选项的话,线程dump只包含监视信息。
jstack pid option 的输出和通过应用控制台按下ctrl + \或者发送QUIT信号给进程获得的输出一样。
线程dump也可以通过编程方式获得:使用Thread.getAllStackTraces方法,或者在调试器中庸调试选项打印所有线程堆栈。
强制堆栈dump
如果jstack pid命令由于进程挂起而不响应了,那么可以使用-F选项(仅针对Oracle Solaris和Linux可用)强制dump,jstack -F pid。
从core dump中打印堆栈
要从core dump中获取堆栈信息,可以在core文件上面执行jstack命令,像下面这样
jstack $JAVA_HOME/bin/java core
打印混合堆栈
jstack功能也能打印混合堆栈信息,就是说它除了能打印java堆栈外还能打印本地堆栈,本地帧是关联到VM的c/c++帧和JNI/native代码。
jstack -m pid
以星号作为前缀的是Java帧,没有的话则是本地c/c++帧。