如何从正在运行的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堆栈跟踪的快照中看到许多不同状态的许多不同线程。 使用的关键是:
R运行或可运行的线程
S暂停的线程
CW线程等待条件变量
MW线程在监视器锁上等待
MS线程暂停等待监视器锁“
此处找到的stacktrace应用程序也很有用,尤其是在Windows应用程序未从命令行启动时。
Thread.getAllStackTraces()(自Java 1.5开始)
两种选择:
选项1 使用JMX控制台生成线程转储
为了生成线程转储:
- 打开JMXConsole(例如:
http://localhost:8080
) - 导航到
jboss.system:type=ServerInfo
mbean( 提示:你可能只需要CTRL-F并在对话框中输入type = ServerInfo) - 单击Server Info mbean的链接。
- 导航到
listThreadDump
所在的底部 - 单击它并获取您的线程转储
笔记:
如果您使用的是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 。