kill -3 或 jstack :有什么区别?

2022-09-03 01:42:36

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

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

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

任何人都可以向我解释这两种方法之间的区别吗?

提前致谢!


答案 1

该命令可以获取在远程计算机上运行的程序的线程转储,并且也适用于 Windows。jstack

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


答案 2

从 jstack 的 oracle 页面

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

还要记住.Ctrl+\ is equivalent to a SIGQUIT

什么是杀戮-3(unix.se)

kill -l 向我们显示所有信号。在此提示 3 之后表示 SIGQUIT

因此,基本上它们都做完全相同的事情,即要求核心转储。以下是一些与jstack相关的指针:

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

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

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

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

kill -3         |  Jstack
------------------------------  
RUNNABLE        |  IN_NATIVE
TIMED_WAITING   |  BLOCKED
WAITING         |  BLOCKED (PARK)

推荐