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

Vla*_*lev 10 java jvm yourkit stack-trace jvm-crash

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

Vla*_*lev 5

我发现了一个使用堆转储查看器的小技巧(在这种情况下,您的Kit是YourKit,但也可能是其他的)。基本上,您枚举Thread类的所有实例,然后按名称查找所需的线程并打开它。堆栈变量被标记为<局部变量>,如下所示:

在此处输入图片说明

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


Tom*_*icz 3

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

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

  • 我怀疑这是出于安全原因,对于黑客攻击而言,“不容易做到”从来都不是一个好方法。只是我的2分钱。 (4认同)