7

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

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

4

4 回答 4

6

您可以使用ThreadMXBean管理接口。

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

于 2010-10-18T12:38:14.453 回答
6

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

Java VisualVM

于 2014-10-15T18:47:33.200 回答
3

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

http://pastebin.com/zwcKC0hz

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

于 2010-10-18T13:30:26.603 回答
1

如果您进行飞行记录以更深入地了解 JVM 行为,特别关注热方法,这将很有帮助。

通常,一个半小时的录音就足够了。要触发录制,您必须登录到机器,并发出以下命令:

如果使用 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 持续时间=1800s 设置=配置文件名=/tmp/recording.jfr

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

于 2017-11-22T10:16:30.640 回答