如何创建Java Web Start应用程序的线程转储

时间:2008-09-18 07:18:54

标签: java multithreading debugging java-web-start thread-dump

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

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

在Java Web Start控制台中,我可以通过按't'获取线程列表,但不包括stacktraces。

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

5 个答案:

答案 0 :(得分:6)

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

t:   dump thread list
v:   dump thread stack

这适用于JDK6。不了解别人。

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

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

在Unix下: kill -3 <java_process_id> (例如杀-35555)。这不会杀死你的应用。

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

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

此致

答案 1 :(得分:2)

尝试

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

然后,您可以迭代集合以显示您感兴趣的前x个堆栈元素。

答案 2 :(得分:2)

最近的JDK(遗憾的是不是JRE)包括像jstack这样的工具。版本5中的JVM包括JMX扩展以获取线程转储,内存统计信息等等。所有Java应用程序(包括Web启动应用程序)都可以使用此功能。

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

答案 3 :(得分:2)

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

理想的输出是由Ctrl- \(或Ctrl-Break或类似的)产生的,但似乎没有记录的方法来产生它。如果你愿意限制自己使用sun的JVM(或者我想使用反射),你可以在sun.*个包裹周围进行挖掘,看看是否有任何有趣的东西出现。

答案 4 :(得分:0)

从Java 5开始,你有了Thread类的getStackTrace()方法。对于以前的版本,您可以这样做:

Thread.currentThread().dumpStack();

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