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

Posted

技术标签:

【中文标题】如何查看 JMH 中的调用树分析?【英文标题】:How to see call tree profiling in JMH? 【发布时间】:2017-06-02 16:42:21 【问题描述】:

我想分析 JMH 测试并查看 VisualVM 中的调用树。但是当我使用 StackProfiler 时,它会为我提供类似的本地方法,这在我的情况下完全没用。

....[Thread state distributions]....................................................................
 59,9%         TIMED_WAITING
 23,0%         WAITING
 17,0%         RUNNABLE

....[Thread state: TIMED_WAITING]...................................................................
 47,3%  78,9% sun.misc.Unsafe.park
  8,3%  13,8% java.lang.Thread.sleep
  4,4%   7,3% java.lang.Object.wait

....[Thread state: WAITING].........................................................................
 21,9%  95,1% sun.misc.Unsafe.park
  1,1%   4,9% java.lang.Object.wait

....[Thread state: RUNNABLE]........................................................................
 13,5%  79,0% sun.nio.ch.EPollArrayWrapper.epollWait
  2,0%  11,5% java.net.SocketInputStream.socketRead0
  1,0%   5,7% java.net.PlainSocketImpl.socketAccept

【问题讨论】:

【参考方案1】:

JMH 的堆栈分析器是一个相当简单的实现。为什么不使用成熟的分析器——例如你提到的 VisualVM——如果你需要更多的东西?或者,请参阅-prof stack:help

$ java -jar jmh-samples/target/benchmarks.jar -prof stack:help
Usage: -prof <profiler-name>:opt1=value1,value2;opt2=value3

Options accepted by org.openjdk.jmh.profile.StackProfiler:

  lines=<int>     Number of stack lines to save in each stack trace.
                  Larger values provide more insight into who is calling
                  the top stack method, as the expense of more stack
                  trace shapes to collect. (default: [1])

【讨论】:

看来你是对的。在我的情况下,创建类似“new OptionsBuilder().addProfiler("stack", "lines=5;top=3;detailLine=true;excludePackages=true;period=1")...”的选项,但对于复杂的长时间运行的方法更容易编写一个小类并使用 VisualVM。

以上是关于如何查看 JMH 中的调用树分析?的主要内容,如果未能解决你的问题,请参考以下文章

如何高效地分析Android_log中的问题?——查看Android源码

10_Linux 环境中如何查看进程树

_ReadWriteBarrier 如何向上传播调用树?

如何查看Maven仓库树

如何查看 XCUIElement 树?

从 JMH 的分析中排除 @Setup 方法