我有一个作为 Windows 服务运行的 Tomcat,并且已知这些 Tomcat 不能很好地与 jstack 一起使用。另一方面,jconsole 运行良好,我可以看到单个线程的堆栈(我正在连接到“localhost:port”来访问它)。
如何使用 jconsole 或类似工具将所有线程堆栈转储到文件中?(类似于 jstack)
您可以使用ThreadMXBean管理接口。
这个FullThreadDump类演示了获取完整线程转储以及使用 JMX 远程检测死锁的能力。
现在您可以使用 jvisualvm 工具通过 JMX 连接到远程 JVM 并创建线程转储。不知道这是否可用
这是另一个将堆栈转储写入文件的代码示例:
我们在 JMX 上使用它来为我们提供当您发出 JMX 请求或进程检测到高的意外负载时获得的堆栈转储的近似值。
如果您进行飞行记录以更深入地了解 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 上生成一个文件。