【问题标题】:How do I create a thread dump via JMX?如何通过 JMX 创建线程转储?
【发布时间】:2010-10-18 12:07:33
【问题描述】:

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

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

【问题讨论】:

    标签: java jconsole jstack


    【解决方案1】:

    您可以使用ThreadMXBean管理界面。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 速度非常慢 :(
      【解决方案3】:

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

      http://pastebin.com/zwcKC0hz

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

      【讨论】:

        【解决方案4】:

        如果您进行飞行记录以更深入地了解 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 duration=1800s settings=profile filename=/tmp/recording.jfr

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多