如何创建 Java Web Start 应用程序的线程转储
-
01-07-2019 - |
题
是否可以获取 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