如何从正在运行的 JBoss 实例生成和分析线程转储?
7 回答
有一个 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 程序的窗口中输入键序列 <ctrl>\。发送此信号指示 JVM 中的信号处理程序,以递归方式打印出有关 JVM 内部线程和监视器的所有信息。”
...
“确定线程状态
您将在来自 JVM 堆栈跟踪的快照中看到处于许多不同状态的许多不同线程。使用的密钥是:
R 正在运行或可运行的线程
S 悬线
CW 线程等待条件变量
MW 线程等待监视器锁
MS 线程挂起等待监视器锁”
此处找到的 stacktrace 应用程序也很有用,尤其是在未从命令行启动 java 应用程序的 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 生成线程转储
或者,您可以使用 twiddle 执行该listThreadDump()
方法并将返回的 HTML 直接通过管道传输到文件。使用这个命令行:
<JBOSS_HOME>/bin/twiddle invoke "jboss.system:type=ServerInfo" listThreadDump > threads.html
有时 JBoss 锁定太多,甚至 jmx-concole 都没有响应。在这种情况下,在 Linux 上使用 kill -3,在 Windows 上使用SendSignal。
https://community.jboss.org/wiki/ThreadDumpJSP页面具有独立的自包含 threaddump.war,可以在没有 JMX 的情况下使用。