Java VisualVM geben bizarre Ergebnisse für die CPU-profiling - Hat sonst noch jemand dieses?

Ich geschrieben habe, diese kleine (und Brutal ineffizient) Klasse und wollte das Profil mit Hilfe der Java VisualVM.

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        int n = Integer.parseInt(args[0]);
        int fib = fib(n);
        System.out.println(fib);
    }

    private static int fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n-1)+fib(n-2);
    }
}

Die Ergebnisse sind Bizarr. Die Ergebnisse sind völlig dominiert durch Aufrufe ConnectionHandler.run().

(98.2%) Sonne.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()

(1.7%) java.lang.Thread.join(long)

(0%) java.lang.String.equals(Object)

etc...

Gibt es wahrscheinlich rund hundert Methoden profiliert und nicht einer von Ihnen ist fib(int)!

Es ist unvorstellbar, dass mein Programm ist tatsächlich verbringen alle seine Zeit in diese Methoden. Sie zu sein scheinen die profiler-Verbindung zu meinem jvm und Ihr Ding macht.

Was mache ich falsch?

Bearbeitet für Klarheit: Wenn Sie übergeben, 45 für die n-diese Anwendung läuft für die 20 gut profilierten Sekunden. Das Programm, das ich war-profiling-ursprünglich (nicht ein fibonacci-Rechner) Heringe alle vier Kerne meiner cpu bei 100% und ich war dabei profiling läuft dauert bis zu 5 Minuten. Diese hatte die gleichen Ergebnisse und Methoden aus meiner Anwendung nicht erscheinen, hoch oben auf der hot spot Methode-Liste.

Variiert von run zu run, aber ConnectionHandler.run() ist immer an der Spitze und in der Regel Konten für ~99% des Profils Zeit.

Zweiter Edit: ich habe versucht mit dem sampler und ich bin jetzt immer Ergebnisse, die im Einklang stehen mit dem, was JProfiler produziert. Der Nachteil dabei ist, dass ich nicht bekommen, die stack-trace-Informationen, mit profiling. Aber für meine unmittelbaren Bedürfnisse dieser ist ausgezeichnet.

Etwas, das ich entdeckt, während rund um das Spiel ist, dass VisualVM zählt Wand-Uhr Zeit für Methodenaufrufe während der Profilerstellung werden.

In meinem speziellen Fall meine Anwendung hat einen main-thread startet die worker-threads und sofort blockiert warten auf eine Nachricht auf einer queue.

Dies bedeutet, dass die blockierende Methode erscheinen wird, nehmen fast die ganze Zeit auf dem profiler-trotz der Tatsache, dass es nicht die Methode, die frisst meine CPU.

Ich würde erwarten, dass das gleiche gilt von der Sonne.rmi.transport.tcp.TCPTransport$ConnectionHandler.die run () - Methode, die macht seinen job gut - aber wenn es endet, es wird eines der längsten Verfahren in meinem Antrag - wiederholt.

  • Verwenden Sie CPU-sampler oder das instrumentierte profiler? Was sind die Einstellungen? Es scheint, dass Sie entweder mit dem CPU-sampler (könnte Verzerrungen der Ergebnisse durch die Probenahme Granularität etc.) oder Ihre profiling-Einstellungen sind nicht richtig eingestellt.
  • Das ist die Art von nussig, was Sie bekommen können, mit einigen Profiler. Während Sie versuchen, das herauszufinden, versuchen Sie einfach diese Methode.
  • Sieht aus, wie Sie lief in das gleiche problem wie Glunk: stackoverflow.com/questions/3243100/... es scheint wie ein jvisualvm Methode instrumentation Mangel, wo, wenn Sie anrufen wenn Sie von der main es kann nicht neu definiert werden.
  • Danke für den Hinweis aus dem sampling-Modus.
  • können Sie mir sagen, welche Einstellungen gut funktioniert für Sie?
  • Ich kam nie richtig funktionieren, fürchte ich. Ich benutze jprofiler, wenn ich eine bekommen kann. Aus der Erinnerung ich habe nie zufriedenstellende Ergebnisse aus visualjvm auf den code, den ich war mit ihm auf. Kann es sich verbessert haben, da dann, das war vor langer Zeit.

Schreibe einen Kommentar