我想获取在 jboss 服务器上运行的 Web 应用程序的线程转储。
我为我的问题找到了两种解决方案:
- 使用 unix 命令:kill -3
- 使用 JDK 中存在的 jstack 工具。
谁能向我解释这两种方法之间的区别?
提前致谢 !
我想获取在 jboss 服务器上运行的 Web 应用程序的线程转储。
我为我的问题找到了两种解决方案:
谁能向我解释这两种方法之间的区别?
提前致谢 !
该jstack
命令可以获取在远程机器上运行的程序的线程转储,它也适用于 Windows。
kill -3
仅适用于本地程序,在 Windows 上没有kill
.
从 jstack 的oracle 页面:
jstack pid 选项的输出与在应用程序控制台(标准输入)按 Ctrl+\ 或向进程发送 QUIT 信号获得的输出相同。
还记得那个Ctrl+\ is equivalent to a 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)
在 Windows 中,你有一个叫做“taskkill /PID {yourpid} /F”的东西,用于杀死进程。进程id可以通过netstat命令获取或者使用viusal vm知道进程id