2017-06-02 32 views
1

我想剖析JMH测试并查看VisualVM中的调用树。但是,当我使用StackProfiler时,它给了我这样的本地方法,这在我的情况下完全没用。如何在JMH中查看调用树分析?

....[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 

回答

3

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]) 
+0

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