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

17

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

我找到了两种解决方案:

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

有人能解释一下这两种方法之间的区别吗?

提前感谢!

3个回答

21

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

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


4
Jstack还可以让您在使用kill -3(或QUIT)将栈输出发送到控制台的同时将其发送到文件中。但是,如果您的操作系统支持kill,则输出应该是相同的。 - Gray
2
并非总是如此。对我而言,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
  • Oracle是否建议使用其中之一而非另一个?
  • 近期Java版本中,这两个都是维护的(没有弃用)吗?
  • 这两个在JRE/JDK中都可用吗?
  • 输出方面有什么区别?
- Nicolas Raoul

2

来自 jstack 的 oracle 页面

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

还要记住,Ctrl+\ 相当于 SIGQUIT

what is kill -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)

-1
在Windows中,你可以使用"taskkill /PID {yourpid} /F"来结束进程。进程ID可以通过netstat命令获取,或者使用Visual VM来获取进程ID。

2
这个问题与终止进程无关。 - Nicolas Raoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接