5

是否可以获得 Java Web Start 应用程序的线程转储?如果是这样,怎么办?

如果有一个简单的解决方案会很好,这将使非开发人员(客户)能够创建线程转储。或者,是否可以以编程方式创建线程转储?

在 Java Web Start 控制台中,我可以通过按“t”来获取线程列表,但不包括堆栈跟踪。

如果答案需要某些 java 版本,请这样说。

4

5 回答 5

6

在控制台中,按 V 而不是 T:

t:   dump thread list
v:   dump thread stack

这适用于JDK6。不知道别人。

或者,在 JDK5(可能更早)下,您可以将所有线程的完整堆栈跟踪发送到标准输出:

在 Windows 下:在 Java 控制台中键入 ctrl-break。

在 Unix 下:( kill -3 <java_process_id> 例如 kill -3 5555)。这不会杀死您的应用程序。

另一件事:正如其他人所说,您可以通过Thread类以编程方式获取堆栈,但Thread.getAllStackTraces()在 JDK6 之前要小心,因为存在内存泄漏。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648

问候,

斯科蒂

于 2008-09-18T09:09:10.713 回答
2

尝试

StackTraceElement[] stack = Thread.currentThread().getStackTrace();

然后您可以遍历集合以显示您感兴趣的顶部 x 堆栈元素。

于 2008-09-18T07:28:01.317 回答
2

最近的 JDK(遗憾的是不是 JRE)包括像 jstack 这样的工具来做这些事情。版本 5 的 JVM 包括 JMX 扩展,用于获取线程转储、内存统计信息等。所有 java 应用程序,包括 web start 应用程序,都具有此功能。

您要么需要安装 JDK,要么需要编写一个执行相同操作的 JMX 客户端。查看http://java.sun.com/javase/6/docs/technotes/guides/management/以获取更多信息。

于 2008-09-18T07:37:02.650 回答
2

从 1.5 开始,您可以使用Thread.getAllStackTraces()aMap进行迭代。

理想的输出是由 Ctrl-\ (或 Ctrl-Break 或类似的)产生的,但似乎没有记录的方式来产生这个。如果您愿意将自己限制在 sun 的 JVM 上(或者我想使用反射),您可以挖掘一下这些sun.*包,看看是否有任何有趣的东西出现。

于 2008-09-18T07:51:00.403 回答
0

从 Java 5 开始,您拥有 Thread 类的 getStackTrace() 方法。对于以前的版本,您可以执行以下操作:

Thread.currentThread().dumpStack();

这会将堆栈跟踪打印到 System.out

于 2008-09-18T07:50:27.393 回答