我想获取在jboss服务器上运行的Web应用程序的线程转储。
我找到了两种解决方案:
- 使用Unix命令:kill -3
- 使用JDK中存在的 jstack 工具。
有人能解释一下这两种方法之间的区别吗?
提前感谢!
我想获取在jboss服务器上运行的Web应用程序的线程转储。
我找到了两种解决方案:
有人能解释一下这两种方法之间的区别吗?
提前感谢!
jstack
命令可获取在远程机器上运行的程序的线程转储,并且它也适用于 Windows。
kill -3
仅适用于本地程序,在 Windows 上没有 kill
命令。
来自 jstack 的 oracle 页面:
jstack pid 选项的输出与在应用程序控制台(标准输入)上按 Ctrl+\ 或向进程发送 QUIT 信号获得的输出相同。
还要记住,Ctrl+\ 相当于 SIGQUIT
。
kill -l 显示所有信号。根据此提示,3 表示 SIGQUIT。
因此,两者基本上做的事情完全相同,即请求一个核心转储。以下是与 jstack 相关的一些指针:
关于官方支持,从jstack手册页中可以看到:
打印Java进程、核心文件或远程调试服务器的Java线程堆栈跟踪。此命令是实验性的且不受支持。
此实用程序未得到支持,可能在JDK的未来版本中不可用。在dbgeng.dll文件不存在的Windows系统中,必须安装Windows调试工具才能使这些工具正常工作。
关于输出差异,基本上是相同的东西。输出之间存在一对一的映射关系。查看我的相同应用程序的输出以演示kill -3
和jstack
状态之间的映射关系。状态之间的映射关系如下:
kill -3 | Jstack
------------------------------
RUNNABLE | IN_NATIVE
TIMED_WAITING | BLOCKED
WAITING | BLOCKED (PARK)
jstack -F 1138
只打印了:Thread 1138: (state = IN_JAVA)
,而kill -3 1138
则打印了Full thread dump... "ActorSystem-scheduler-1" #14 prio=5 os_prio=0 tid=0x00007fddb4f58800 nid=0x472 runnable [0x00007fdda4124000] java.lang.Thread.State: RUNNABLE
。 - mirelon