如何从正在运行的JBoss实例生成和分析线程转储?

如何从正在运行的JBoss实例生成和分析线程转储?

有一个JBoss特定的方法稍微用户友好:

http://community.jboss.org/wiki/GenerateAThreadDumpWithTheJMXConsole

当您无法直接访问主机(“kill”需要)时,这尤其有用。

http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/

“在UNIX平台上,您可以使用kill命令向程序发送信号。这是退出信号,由JVM处理。例如,在Solaris上,您可以使用命令kill -QUIT process_id,其中process_id是您的Java程序的进程号。

或者,您可以在启动Java程序的窗口中输入键序列 \。 发送此信号指示JVM中的信号处理程序,以递归方式打印出JVM内线程和监视器上的所有信息。“

“确定线程状态

您将在JVM堆栈跟踪的快照中看到许多不同状态的许多不同线程。 使用的关键是:

R运行或可运行的线程

S暂停的线程

CW线程等待条件变量

MW线程在监视器锁上等待

MS线程暂停等待监视器锁“

此处找到的stacktrace应用程序也很有用,尤其是在Windows应用程序未从命令行启动时。

Thread.getAllStackTraces()(自Java 1.5开始)

两种选择:

选项1 使用JMX控制台生成线程转储

为了生成线程转储:

  1. 打开JMXConsole(例如: http://localhost:8080
  2. 导航到jboss.system:type=ServerInfo mbean( 提示:你可能只需要CTRL-F并在对话框中输入type = ServerInfo)
  3. 单击Server Info mbean的链接。
  4. 导航到listThreadDump所在的底部
  5. 单击它并获取您的线程转储

笔记:

如果您使用的是Internet Explorer,则应使用“ File > Save As来保存输出,而不是将数据复制到文本编辑器。 出于某种原因,当您从Internet Explorer复制文本时,不会复制换行符,并且所有输出都会在一行上结束。

选项2 使用Twiddle生成线程转储

或者,您可以使用旋转来执行listThreadDump()方法,并将返回的HTML直接传递给文件。 使用此命令行:

 /bin/twiddle invoke "jboss.system:type=ServerInfo" listThreadDump > threads.html 

有时JBoss锁定太多,甚至jmx-concole都没有响应。 在这种情况下,在Linux上使用kill -3,在Windows上使用SendSignal 。