如何创建Java Web Start应用程序的线程转储
是否可以获取Java Web Start应用程序的线程转储?如果是这样,怎么办?
如果有一个简单的解决方案,这将很好,这将使非开发人员(客户)可以创建线程转储。另外,是否可以通过编程方式创建线程转储?
在Java Web Start控制台中,我可以通过按" t"获取线程列表,但不包括堆栈跟踪。
如果答案需要某些Java版本,请这样说。
解决方案
尝试
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
然后,我们可以遍历集合以显示我们感兴趣的前x个堆栈元素。
最近的JDK(不幸的是不是JRE)包括诸如jstack之类的工具,它可以完成这些工作。版本5的JVM包括JMX扩展,以获取线程转储,内存统计信息等等。所有Java应用程序,包括Web Start应用程序,都具有此功能。
我们可能需要安装JDK或者编写一个执行相同操作的JMX客户端。查看http://java.sun.com/javase/6/docs/technotes/guides/management/以获取更多信息。
从Java 5开始,我们有了Thread类的getStackTrace()方法。对于以前的版本,我们可以执行以下操作:
Thread.currentThread().dumpStack();
这会将堆栈跟踪打印到System.out
从1.5开始,我们可以使用Thread.getAllStackTraces()获得一个Map进行迭代。
理想的输出应该是从Ctrl-(或者Ctrl-Break或者类似的东西)产生的输出,但是似乎没有记录的产生方式。如果我们愿意限制自己使用sun的JVM(或者我想使用反射),则可以深入了解sun。*软件包,看看是否有有趣的东西出现。
在控制台中,按V而不是T:
t: dump thread list v: dump thread stack
这在JDK6下有效。不了解别人。
或者,在JDK5(可能更早)下,我们可以将所有线程的完整堆栈跟踪发送到标准输出:
在Windows下:在Java控制台中键入ctrl-break。
在Unix下:kill -3 <java_process_id>
(例如,杀死-3 5555)。这不会杀死应用程序。
另一件事:正如其他人所说,我们可以通过Thread类以编程方式获取堆栈,但在JDK6之前要注意Thread.getAllStackTraces(),因为这会导致内存泄漏。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434648
问候,
粗暴的