如何查看 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 中的调用树分析?的主要内容,如果未能解决你的问题,请参考以下文章