16

我想获取在 jboss 服务器上运行的 Web 应用程序的线程转储。

我为我的问题找到了两种解决方案:

  • 使用 unix 命令:kill -3
  • 使用 JDK 中存在的 jstack 工具。

谁能向我解释这两种方法之间的区别?

提前致谢 !

4

3 回答 3

19

jstack命令可以获取在远程机器上运行的程序的线程转储,它也适用于 Windows。

kill -3仅适用于本地程序,在 Windows 上没有kill.

于 2013-06-03T14:56:42.933 回答
2

从 jstack 的oracle 页面

jstack pid 选项的输出与在应用程序控制台(标准输入)按 Ctrl+\ 或向进程发送 QUIT 信号获得的输出相同。

还记得那个Ctrl+\ is equivalent to a SIGQUIT

什么是 kill -3 (unix.se)

kill -l 向我们显示所有信号。遵循此提示 3 表示 SIGQUIT

所以基本上他们都做同样的事情,即要求一个核心转储。以下是一些与 jstack 相关的指针:

  • Jstack 默认执行死锁检测。
  • 关于官方支持,来自jstack 手册页

    打印 Java 进程、核心文件或远程调试服务器的 Java 线程堆栈跟踪。此命令是实验性的,不受支持。

    此实用程序不受支持,并且可能在 JDK 的未来版本中不可用。在不存在 dbgeng.dll 文件的 Windows 系统中,必须安装 Windows 调试工具才能使这些工具正常工作。

关于输出差异,基本上是一样的。输出之间存在一对一的映射。请参阅我对同一应用程序的输出,kill -3以演示和的状态之间的映射jstack。状态之间的映射为:

kill -3         |  Jstack
------------------------------  
RUNNABLE        |  IN_NATIVE
TIMED_WAITING   |  BLOCKED
WAITING         |  BLOCKED (PARK)
于 2018-04-02T20:14:44.340 回答
-1

在 Windows 中,你有一个叫做“taskkill /PID {yourpid} /F”的东西,用于杀死进程。进程id可以通过netstat命令获取或者使用viusal vm知道进程id

于 2018-04-03T08:53:31.143 回答