我可以从实时JVM转储当前线程堆栈变量吗?

时间:2012-11-13 18:14:56

标签: java jvm stack-trace jvm-crash yourkit

我需要查看2个死锁线程的堆栈来分析情况。 JVM现在正在运行,数据就在那里,但我需要某种工具来从流程中提取它。我只关心类型为String的堆栈中的6个变量。任何想法都非常感谢。 JVM个版本6_35,它是linuxJMX已启用,但我没有配置profiler/debugger连接。重现起来非常困难。

3 个答案:

答案 0 :(得分:4)

你不能轻易做到这一点。普通jstack工具只会转储堆栈。从技术上讲,你可以尝试转储整个堆(使用jmap)但是如果可能的话,寻找这个特定的变量会很痛苦。

请注意,出于安全原因,这并不容易。堆栈跟踪可以包含凭据或其他敏感数据。

答案 1 :(得分:4)

我发现了一个使用堆转储查看器的小技巧(在这个例子中是YourKit,但也可能是其他工作)。基本上,您枚举Thread类的所有实例,然后按名称找到所需的线程并打开它。堆栈变量标记为<本地变量> 像这样:

enter image description here

并非所有变量都在这里,但显示了作为参数传递给方法的所有变量。我想知道分析者是否可以更好地解决这个问题?

答案 2 :(得分:0)

您可以在类似Unix的操作系统上使用Sun / Oracle JVM发送一个SIGQUIT进程dump and keep the VM running,而不是IBM's JVM。输出将适合您的目的,艰难。可能与另一个答案中的jstack / jmap相似。