是否可以获得Java Web Start应用程序的线程转储?如果是这样,怎么样?
如果有一个简单的解决方案,这将使非开发人员(客户)能够创建一个线程转储,这将是很好的。或者,是否可以通过编程方式创建线程转储?
在Java Web Start控制台中,我可以通过按't'获取线程列表,但不包括stacktraces。
如果答案需要某些java版本,请说明。
答案 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