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

时间:2013-06-03 14:49:32

标签: java kill thread-dump jstack

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

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

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

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

提前致谢!

3 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:2)

来自jstack的oracle page

  

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

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

来自what is kill -3 (unix.se)

  

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

所以基本上他们两个都完全一样,即要求一个coredump。以下是与jstack相关的一些指示:

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

      

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

         

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

关于输出差异,它的基本相同。输出之间存在一对一的映射。请参阅我的output for the same application,以演示kill -3jstack的状态之间的映射。状态之间的映射是:

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

答案 2 :(得分:-1)

在Windows中,你有一些名为" taskkill / PID {yourpid} / F"用于杀戮过程。可以从netstat命令获取进程ID,或使用viusal vm获知进程ID