是否可以获取 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>(例如。杀死-3 5555)。这不会杀死你的应用程序。

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

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

问候,

斯科蒂

其他提示

最近的 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() 得到一个 Map 迭代。

理想的输出是由 Ctrl-\ (或 Ctrl-Break 或类似的)生成的,但似乎没有记录的生成方法。如果您愿意将自己限制在 sun 的 JVM(或者我想使用反射),您可以深入了解一下 sun.* 包,看看是否有任何有趣的东西出现。

尝试

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

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

从 Java 5 开始,Thread 类有了 getStackTrace() 方法。对于之前的版本,您可以执行以下操作:

Thread.currentThread().dumpStack();

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top