【问题标题】:java stack dump on windowswindows上的java堆栈转储
【发布时间】:2011-01-08 15:23:55
【问题描述】:

我在标准 Windows 命令窗口中有一个正在运行的 java 进程。即我已经运行 'cmd' 并输入了 java -jar ...

如果可能的话,我需要能够获得所有线程的完整堆栈转储。

我记得在 linux 下你可以通过 quit 命令上的一个选项向 JVM 发送消息。

this document太阳州

在 Windows 上生成堆栈跟踪 95 或 Windows NT 平台,输入 中的键序列 Java程序所在的窗口 运行,或单击关闭按钮 窗户。

这显然是错误的,因为关闭终端只会终止进程并关闭窗口。

【问题讨论】:

    标签: java windows


    【解决方案1】:

    您可以使用jstack [ option ] pid(如果问题是关于线程转储的)。使用jps 查找您的Java 进程的ID。

    【讨论】:

    • 如果你的 java 进程没有控制台窗口,那么这适用于在 Windows 上获取线程转储。
    • 完美答案!
    【解决方案2】:

    在 Java 6 JDK+ 中,jvisualvm 可执行文件允许您附加到正在运行的程序(双击左侧的条目)。

    连接后,右侧有一个线程窗格,其中有一个线程转储按钮。

    这会给你一个线程转储。

    生成后,您可以 A) 全选 - 将线程转储复制并粘贴到文本编辑器。或 B)您可以右键单击在左侧树中创建的线程转储并说“另存为”。

    Notes jvisualvm 还允许您拍摄整个应用程序的快照以供以后分析。

    【讨论】:

      【解决方案3】:

      其他海报是正确的 - 控制台或 jstack 中的 ctrl-break。

      否则,如果您使用的是 Java 1.5 或更高版本,则可以通过以下方式在运行时以编程方式获取此信息:

      Thread.getAllStackTraces()(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getAllStackTraces())

      然后遍历结果。

      有点啰嗦,不过是这样的:

      Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces();
      Iterator<Thread> i = traces.keySet().iterator();
      while (i.hasNext()) {
         Thread thd = i.next();
         System.out.println("*** Thread id"+thd.getId()+":"+thd.getName()+" ***");
         StackTraceElement[] trace = traces.get(thd);
         for (int j=0; j < trace.length; ++j) {
            System.out.println(trace[j]);
         }
         System.out.println();
      }
      

      然后你可以选择任何你想捕获你的程序的方法来导致这种情况发生,并格式化/定向输出。

      这种方法的一个缺点是它不精确,因为不能保证不同线程的堆栈在完全相同的时间被占用。但是,有一个相关的性能优势,即在拍摄快照时您的整个进程不会暂停。

      【讨论】:

        【解决方案4】:

        看看这篇 Stack Overflow 帖子

        Thread dump programmatically /JDI (Java Debugger Interface)

        我们已经实现了一个 JMX 方法来转储堆栈跟踪。这非常方便,因为您甚至可以在远程计算机上在 Web 浏览器中检查堆栈跟踪。

        【讨论】:

          【解决方案5】:

          除了 Seth 的回答之外,您还可以在您的机器上启动 JConsole 以检查每个线程的堆栈跟踪。这具有能够检测死锁和监控内存使用情况的额外好处。

          【讨论】:

            【解决方案6】:
            【解决方案7】:

            键入 Ctrl+Break 是在 Windows 上生成线程转储的正确方法。

            您是否正在按下 Ctrl+C(=interrupt)?这将发送一个 SIGINT,这通常会终止您的进程。

            【讨论】:

              猜你喜欢
              • 2016-04-03
              • 1970-01-01
              • 2012-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-04
              • 1970-01-01
              • 2019-04-01
              相关资源
              最近更新 更多