是否可以获得 Java Web Start 应用程序的线程转储?如果是这样,怎么办?
如果有一个简单的解决方案会很好,这将使非开发人员(客户)能够创建线程转储。或者,是否可以以编程方式创建线程转储?
在 Java Web Start 控制台中,我可以通过按“t”来获取线程列表,但不包括堆栈跟踪。
如果答案需要某些 java 版本,请这样说。
是否可以获得 Java Web Start 应用程序的线程转储?如果是这样,怎么办?
如果有一个简单的解决方案会很好,这将使非开发人员(客户)能够创建线程转储。或者,是否可以以编程方式创建线程转储?
在 Java Web Start 控制台中,我可以通过按“t”来获取线程列表,但不包括堆栈跟踪。
如果答案需要某些 java 版本,请这样说。
在控制台中,按 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
问候,
斯科蒂
尝试
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/以获取更多信息。
从 1.5 开始,您可以使用Thread.getAllStackTraces()
aMap
进行迭代。
理想的输出是由 Ctrl-\ (或 Ctrl-Break 或类似的)产生的,但似乎没有记录的方式来产生这个。如果您愿意将自己限制在 sun 的 JVM 上(或者我想使用反射),您可以挖掘一下这些sun.*
包,看看是否有任何有趣的东西出现。
从 Java 5 开始,您拥有 Thread 类的 getStackTrace() 方法。对于以前的版本,您可以执行以下操作:
Thread.currentThread().dumpStack();
这会将堆栈跟踪打印到 System.out