如何通过JMX创建线程转储?

时间:2010-10-18 12:07:34

标签: java jconsole jstack

我有一个运行作为Windows服务的Tomcat,并且已知这些不能与jstack一起运行。另一方面,jconsole运行良好,我可以看到各个线程的堆栈(我正在连接到“localhost:port”来访问它)。

如何使用jconsole或类似工具将所有线程堆栈转储到文件中? (类似于jstack)

4 个答案:

答案 0 :(得分:5)

您可以使用ThreadMXBean管理界面。

FullThreadDump类演示了获取完整线程转储的能力,并使用JMX远程检测死锁。

答案 1 :(得分:5)

现在您可以使用jvisualvm工具通过JMX连接到远程JVM并创建线程转储。不知道这是否可用

Java VisualVM

答案 2 :(得分:3)

这是另一个将堆栈转储写入文件的代码示例:

  

http://pastebin.com/zwcKC0hz

我们在JMX上使用它来为我们提供您在发出JMX请求时获得的堆栈转储的近似值,或者该过程是否检测到高意外负载。

答案 3 :(得分:1)

如果您进行飞行录制以更深入地了解JVM行为,特别关注Hot Methods,将会很有帮助。

通常,半小时的录音就足够了。要触发录制,您必须登录到计算机,然后发出以下命令:

如果使用Java HotSpot 1.8.x:

$ JAVA_HOME / bin / jcmd VM.unlock_commercial_features $ JAVA_HOME / bin / jcmd JFR.start duration = 1800s settings = profile filename = / tmp / recording.jfr

如果使用java HotSpot 1.7.x:

通过在JVM启动时添加以下参数来编辑$ HOME / conf / wrapper.conf文件:

wrapper.java.additiona = - XX:+ UnlockCommercialFeatures wrapper.java.additional。= - XX:+ FlightRecorder

(替换为相应的位置编号)

然后,重新启动实例。完成后,发出以下命令:

$ JAVA_HOME / bin / jcmd JFR.start duration = 1800s settings = profile filename = / tmp / recording.jfr

飞行记录将在终止时在/tmp/recording.jfr上生成一个文件。