我可以从实时JVM转储当前线程堆栈变量吗?
我需要窥视2个死锁线程的堆栈来分析情况。 JVM
现在正在运行,并且数据在那里,但我需要某种工具从流程中提取它。 我只关心String
类型的堆栈中的6个变量。 任何想法,不胜感激。 JVM
版本6_35
,它是一个linux
,启用了JMX
,但我没有配置它的配置文件profiler/debugger
连接。 复制非常困难。
你不能轻易做到这一点。 普通的jstack
工具只会转储堆栈。 从技术上讲,你可以尝试倾倒整个堆(使用jmap
),但如果可能的话,寻找这个特定的变量可能是一个痛苦。
请注意,出于安全原因,这不太容易实现。 堆栈跟踪可以包含凭据或其他敏感数据。
我发现了一个使用堆转储查看器的小技巧(YourKit在这个例子中,但也可能是其他工作)。 基本上你枚举了Thread类的所有实例,然后按名称找到想要的线程并将其打开。 堆栈变量被标记为<局部变量>像这样:
并不是所有的变量都在这里,但是所有作为参数传递给方法的参数都会显示出来。 我不知道这些分析师是否可以更好地解决这个问题?
您可以像在IBM的JVM一样,使用Sun / Oracle JVM在一个类似Unix的操作系统上发送一个SIGQUIT,它可以为您提供转储并保持虚拟机运行 - 不确定输出是否适合您的目的,强硬。 在另一个答案中可能类似于jstack
/ jmap
。
上一篇: Can I dump the current thread stack variables from a live JVM?
下一篇: RunWith(PowerMockRunner.class) does not work with package annotation