2012-11-13 36 views
7

我需要查看2个死锁线程的堆栈来分析情况。 JVM现在正在运行,数据在那里,但我需要某种工具从流程中提取它。我只关心String类型的堆栈中的6个变量。任何想法,不胜感激。 JVM版本6_35,这是一个linuxJMX已启用,但我没有配置一个profiler/debugger连接。复制非常困难。我可以从实时JVM转储当前线程堆栈变量吗?

+3

你好,投票者? – ShiDoiSi

回答

3

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

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

+2

我怀疑这是出于安全原因,“不容易实现”在黑客攻击方面从来就不是一个好方法。只是我2美分。 –

0

您可以发送过程中的SIGQUIT,这将给你一个dump and keep the VM running,在与Sun/Oracle的JVM类似Unix的操作系统,如将IBM's JVM - 不知道,如果输出将是适合你的目的,坚韧。在另一个答案中可能类似于jstack/jmap

+0

这只是给出一个线程转储(每个线程调用的方法的序列)而不是每个线程中变量的状态。 –

1

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

enter image description here

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