7

我喜欢以编程方式生成线程转储。我了解到基本上有两种方法可以做到这一点:

  1. 使用“Java 虚拟机工具接口”JVM-TI
  2. 使用更高抽象的“Java 调试器接口”JDI

对于 JVM-TI,我能够找到一些有用的信息,但我必须编写一个 JNI-DLL,至少目前我想避免这种情况。通过 JDI,我可以使用 Java,而且似乎可以在应用程序中使用它。但我无法找到某种教程或 HOWTO。我能找到的唯一文档是 Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/这不是很有帮助,因为它没有向我展示如何使用这些类。

那么,有人知道我可以阅读的好教程/书吗?

感谢您的帮助!

4

4 回答 4

21

还有第三种方式:Thread.getAllStackTraces()

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

这比调试器界面容易得多......

于 2008-10-27T15:07:25.627 回答
8

您可以从http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html获得几乎所有需要的线程信息,包括死锁

于 2009-03-27T18:53:16.750 回答
3

Thread.getAllStackTraces() 仅转储所有线程的执行跟踪,但不提供特定线程已获得的对象锁或特定线程一直在等待的锁的信息。基本上,我们将无法解决这个问题。

于 2008-10-31T09:55:12.103 回答
1

您是否考虑过远程替代方案?即VisualVM

使用 visualVM 转储

jps 和 jstack也是 JDK 5 中包含的有用工具,它们提供了一种快速命令行方法来获取所有当前线程的堆栈跟踪。

本文建议将 JDI 也用作远程工具

因此,我不确定您是否可以在自己的程序中触发线程转储,而是找到一种在 Unix 平台上向自己发送 SIGQUIT 信号(kill -3)的方法,或者在 Unix 上按 Ctrl-\ 键或 Ctrl-Break在 Windows 平台上。

另外,JDI 并不是用来调试运行 JDI 客户端的同一进程。我刚刚链接到的这个线程仍然是我发现在同一程序中实际使用 JDI 的最接近的线程。

于 2008-10-27T11:54:31.240 回答