【问题标题】:How to Force Thread Dump in Eclipse?如何在 Eclipse 中强制线程转储?
【发布时间】:2008-10-28 13:31:01
【问题描述】:

我正在通过 BEA Weblogic Server v9.2 运行时环境在 Eclipse 中启动一个 Weblogic 应用程序。如果这直接从命令行运行,我会执行 ctrl-BREAK 来强制执行线程转储。有没有办法在 Eclipse 中做到这一点?

【问题讨论】:

    标签: java eclipse memory-leaks weblogic


    【解决方案1】:

    确实(感谢 VonC 指向 SO 线程),Dustin 在对他的消息的评论中指向jstack

    我在 Eclipse 中运行了一个小的 Java 应用程序(带有 GUI),我可以在 Windows 的进程管理器中看到相关的 javaw.exe 及其 PID,7088(当然在 Unix 中更简单)。

    如果我在命令提示符处键入 jstack 7088,我将获得每个线程所需的堆栈转储。
    很酷。

    如果我们可以直接从 Eclipse 中执行此操作会更好,但这已经很有用了。

    【讨论】:

    • 警告:我们不知道用于启动eclipse/weblogic的平台:如果是windows,java1.5不支持jstack,1.6只支持部分
    • 直接从 Eclipse 启动外部工具很容易:菜单“运行 -> 外部工具”或“运行”按钮旁边的工具栏按钮(为 PID 添加 string_prompt)
    【解决方案2】:

    您可以在调试模式下执行此操作:进入调试视图中的调试视图,单击已启动的进程并单击暂停,您将获得所有进程的图形堆栈。

    注意:这在使用远程调试时也有效,你不需要从eclipse启动weblogic,你可以自己启动它,打开调试端口并为它创建一个“远程java应用程序调试配置”。

    【讨论】:

    • 是的,但是您需要将其添加到 JVM:set JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      Eclipse Wiki:How to Report a Deadlock 列出了在 Eclipse 中创建线程转储的所有可能选项。根据具体情况,其中一个可能会更好——我个人在 Windows 上最喜欢的是 Adaptj Stacktrace 工具。

      【讨论】:

        【解决方案5】:

        StackTrace 是您可以尝试的另一种选择。从特点:

        运行的 Java 进程的线程转储 作为 Windows 服务(如 Tomcat,用于 例如),以 javaw.exe 开头, 在任何浏览器中运行的小程序或 嵌入在另一个进程中的 JVM。 StackTrace 适用于 Windows、Linux 和 Mac OS X。

        【讨论】:

          【解决方案6】:

          如果您更喜欢基于 UI 的解决方案,visualvm 可能是一个不错的选择。 (优点也是随JDK一起分发)

          在 visualvm 中获取线程转储:

          1. 连接到进程(远程或本地)和
          2. 转到Threads(标签)-> Thread Dump(按钮)

          【讨论】:

          • 值得一提的是,用户必须启动java机器提供的jvisualvm。在我的 linux 机器上,它位于:/usr/lib/jvm/java-7-oracle/bin/jvisualvm
          【解决方案7】:

          您是否尝试使用 java.exe 而不是 javaw.exe(在您的 eclipse.ini 中)启动 eclipse?

          这可能会为您提供所需的控制台,如 this bugthis message 中所述。

          其他想法(在 java 选项方面)可以从这个other SO question 得出。

          【讨论】:

            【解决方案8】:

            您可以通过 JVisualVM 进行连接并获取线程转储。只需右键单击应用程序树中的应用程序节点,然后选择“线程转储”

            【讨论】:

              【解决方案9】:

              在 linux 上,至少您可以通过 ps -ef | grep java 获取 PID,然后通过 kill -3 PID 将其输出到 Eclipse 控制台。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-19
                • 2012-11-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多