如何在 VisualVM 中显示调用树?

Posted

技术标签:

【中文标题】如何在 VisualVM 中显示调用树?【英文标题】:How to display the call tree in VisualVM? 【发布时间】:2013-09-01 18:23:23 【问题描述】:

使用 VisualVM 分析应用程序的 CPU 时间时,可以在拍摄快照后看到“调用树”选项卡。但在我的例子中,调用树只显示了一些 RMI TCP 类和方法,但没有显示我的应用程序的单个类。

如何显示正确的调用树?

【问题讨论】:

【参考方案1】:

可能性

    Profiler 设置不包括您的类。在 Profiler 设置中更改排除项。 您的应用程序在分析器运行时处于空闲状态。附加分析器,然后使程序执行您要分析的代码。 您可能正在分析错误的 JVM。 RMI 使得调用另一个 JVM 变得非常容易。也许您需要分析该 RMI 连接的另一端。

Profiler 选项卡上有一个“设置”复选框。如果您选中“设置”框,则会出现另一个面板,让您可以配置探查器收集哪些类的数据。

这是一个屏幕截图。

【讨论】:

感谢您的设置提示。如果我单击复选框,我会看到已分析的类,但我不允许更改它们。文本框不可编辑。如何编辑它们? 好的,知道了。不得不停止分析以编辑设置。设置正确的类后,我可以看到我的应用程序的正确调用树。【参考方案2】:

正如@Holger 所说,分析器/采样器的快照 应该只显示正在运行的线程。 但是,根据个人经验,我发现采样快照有时会显示比分析快照更多的线程。

此外,VisualVM 的采样器使您能够实时查看每个线程的 CPU 时间(无需拍摄快照),无论它是在运行、睡眠、等待还是监控。

我不明白为什么会发生这种情况,因为分析应该比采样(see here the difference) 更准确,但确实如此。

总而言之,我建议你试试采样器,看看它是否有效。

【讨论】:

谢谢。是的,采样有帮助,通过采样,我可以看到我想看到的调用树。【参考方案3】:

调用树仅显示在采样/分析期间真正运行的线程(并非一直处于休眠状态)并且其堆栈跟踪未被完全过滤掉。在开始采样或分析之前设置过滤器。启用右上角的“设置”复选框时,您可以设置过滤器。对于采样器,您还可以设置采样频率,这是性能和监督线程运行状态的风险之间的权衡。但可能是您的应用程序在分析期间确实处于空闲状态。那么您看到的唯一线程是维护与 VisualVM 的连接的 RMI 线程。

【讨论】:

以上是关于如何在 VisualVM 中显示调用树?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 JMH 中的调用树分析?

如何在 Java VisualVM 中显示探查器选项卡? [复制]

VisualVM 未显示任何调用 CPU 性能分析的方法

如何使用 VisualVM 获取每个函数的时间成本 [重复]

如何告诉 visualvm 在哪里可以找到我的源代码?

在 VisualVM 中哪里可以找到时间(CPU)列?