2017-06-02 94 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。 –