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

5

如何获取Java Web Start应用程序的线程转储?如果可以,如何获取?

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

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

如果答案需要特定的Java版本,请说明。

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类以编程方式获取堆栈,但是要注意在JDK6之前的Thread.getAllStackTraces()存在内存泄漏问题。

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

谢谢,

scotty


2

尝试

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

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

2
最近的JDK(遗憾的是不包括JRE)包含像jstack这样的工具,可以完成此类操作。从第5版本开始,JVM包含JMX扩展以获取线程转储、内存统计信息等等。所有的Java应用程序,包括Web启动应用程序,都可以使用此功能。
您需要安装JDK或编写一个执行相同操作的JMX客户端。请查看http://java.sun.com/javase/6/docs/technotes/guides/management/获取更多信息。

2
自从1.5版本以来,您可以使用Thread.getAllStackTraces()获取一个Map进行迭代。
理想的输出应该是通过Ctrl-\(或Ctrl-Break或类似方法)产生的,但似乎没有记录生成此输出的方法。如果您愿意限制自己使用sun的JVM(或者使用反射),则可以查看sun.*包并查看是否有任何有趣的内容。

0
自 Java 5 开始,Thread 类有 getStackTrace() 方法。而对于早期版本,可以这样:

Thread.currentThread().dumpStack();

这将打印堆栈跟踪至System.out


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接