【问题标题】:Advanced Java profiling高级 Java 分析
【发布时间】:2013-06-05 09:05:26
【问题描述】:

我们公司目前正在寻找 Java 分析器。我们收到了来自 Compuware(dynaTrace 产品)的报价,它能够为 CPU 分析提供这种输出(示例):

(好吧,我不能发图片,剩下的问题应该没有这张图就清楚了)

dynaTrace 为您提供的是一个特定方法的所有调用的列表,其中包含关于每个调用花费了多少 wall 时间、其中多少是 CPU 时间以及等待 IO 的确切信息。这个(在我看来非常简单)信息非常重要,也是我们绝对需要的。

现在,问题是...... 还有什么其他分析器实际上能够提供这个信息之王?

我尝试了 VisualVM(JDK 附带)、YourKit 和 JProfiler。我没有找到任何方法来产生这个输出。

  • 通过采样测量总的挂墙时间和实际 CPU 时间应该非常容易,但 JProfiler 和 YourKit 似乎只能测量挂墙时间或 CPU 时间,而不能同时测量两者。 VisualVM 在采样时同时显示墙和 CPU 时间,这将使其优于这两种付费产品中的任何一种。

  • 分离某个方法的调用并分别显示每个调用的结果(而不是一个方法的聚合信息,而不考虑它被调用的位置和参数)似乎更高级的功能,这些都不是产品似乎能够做到这一点。

这两个功能对于我们在分析器中是必不可少的。如果有人知道提供他们的产品,请告诉我,我将非常感激。

当然,提到的一些分析器很可能具有这些功能,但我在有限的时间内没有找到如何做到这一点,我不得不研究它们。

【问题讨论】:

标签: java profiling cpu


【解决方案1】:

经过大量调查后,答案很简单:没有一个提到的分析器能够满足我在这个问题中想要的功能 - 不是 VisualVM、YourKit 和 JProfiler。

因此,如果您想要此类信息,最好的选择可能是BTrace,它是免费的,并且与 JMX 结合使用,几乎可以测量任何东西。从字面上看——你可以访问所有方法调用,包括所有参数,你可以做任何你可以用 Java 编码的事情。

该版本还包含非常好的示例,因此您将能够在一小时内理解概念并自定义测量。

【讨论】:

  • 所以你选择了 BTrace 而不是 Dynatrace,因为它是免费的?还是您发现它是具有更多功能的更好产品?
【解决方案2】:

虽然 JProfiler 没有以这种方式显示它,但它具有线程状态的概念,并且 CPU 视图在右上角有一个线程状态选择器。 This screen cast 显示切换线程状态的效果。默认情况下,JProfiler 显示“可运行”状态,而不是挂钟时间(“所有状态”)。

【讨论】:

  • 如果可以在呼叫跟踪器中应用此状态选择器(因此对于每个呼叫分别),那将是非常好的。否则它不符合我所说的第二个特征。
  • 你的意思是调用跟踪器还是调用树?调用跟踪器是一个多线程调试工具,我不确定线程​​状态是否适合那里。在调用树中,我们确实计划在“所有状态”视图中显示所有线程状态的细分,但目前还不可能。
  • 我的意思是呼叫跟踪器。因为,正如我在问题中所写,我绝对需要在每次调用方法时查看此信息。而且我认为只有 Call tr​​acer 可以在 JProfiler 中做到这一点。
  • 呼叫跟踪器会产生大量信息。它在您有很好的本地化问题的有限情况下很有用。我不确定线程​​状态分布如何真正从这个角度增加很多洞察力。任何类型的性能分析都是在调用树、热点和调用图视图中完成的——我们将在其中添加线程状态信息。