我可以从实时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

链接地址: http://www.djcxy.com/p/66031.html

上一篇: Can I dump the current thread stack variables from a live JVM?

下一篇: RunWith(PowerMockRunner.class) does not work with package annotation