2017-06-02 2 views
1

Ich möchte JMH-Tests profilieren und einen Aufrufbaum wie im VisualVM betrachten. Aber wenn ich den StackProfiler verwende, gibt es mir native Methoden, die in meinem Fall völlig nutzlos sind.Wie sieht man in JMH Call Tree Profiling?

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

Antwort

3

JMHs Stack Profiler ist eine eher simple Implementierung. Warum nicht den vollwertigen Profiler verwenden - z.B. VisualVM Sie erwähnt - wenn Sie etwas mehr brauchen? Alternativ, siehe -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

Sieht aus, als ob Sie Recht haben. In meinem Fall funktionieren solche Optionen wie "new OptionsBuilder(). AddProfiler (" stack "," Zeilen = 5; top = 3; detailLine = true; excludePackages = true; Punkt = 1 ") ...", aber für komplex lang laufende Methoden einfacher, eine kleine Klasse zu schreiben und den VisualVM zu verwenden. –