2017-04-21 11 views
2

Ich möchte meine Klasse profilieren, es ist so etwas wie ein Puffer, wo ich die Daten meines Benutzers speichern und es danach bekommen. Ich habe Hauptmethode erstellt und die Testmethode in endlosem Zyklus dort laufen lassen.Java Mission Control was bedeuten die Leerzeichen?

public void test(){ 
     buffer.add(n1); 
     Message message = buffer.remove(); 
     msgSeqNum = message.getMsgSeqNum(); 
    } 

msgSeqNum ist globale Variable, ich habe es, um JVM gemacht habe nicht meinen Ruf zu entfernen (ich glaube, es kann mir helfen).

Ich profilierte es für 30 Sekunden, aber wie ich sehen kann, wurde mein Code etwa 40 Mal ausgeführt (ich erwartete ein paar tausend). Ich sehe auch die Leerzeichen in JMC (siehe screenshot), die mir zeigen, dass meine JVM nichts getan hat. Es gab keine GC, Ausnahmen, Aussehen, Wartezeit und mein Code funktioniert sehr schnell.

Ich habe versucht, es mehrmals auszuführen, aber ich bekam das gleiche Ergebnis. Warum passiert das?

OS - Windows

+0

Haben Sie Profiling oder Sampling durchgeführt? – Kayaman

+0

Meinst du Betriebssystem? Es war Windows – ViKo

Antwort

2

Beim Abtasten einer Anwendung (im Gegensatz zu ausgewachsener Profilierung gegen), macht der Profiler überprüft in bestimmten Abständen, um zu sehen, welche Methoden laufen werden. Dies macht es leichter als die Verfolgung jedes einzelnen Aufrufs.

Es bedeutet auch, dass Sie nicht genaue Ergebnisse (die Sie wahrscheinlich nicht benötigen) für Dinge wie Invocation Count erhalten. Sie können denken, dass der Code nur 40 mal ausgeführt wurde, aber in der Tat ist das nur, wie oft der Profiler diese Methode ausgeführt hat. Während eine Sekunde ohne Samples scheinbar lange auf sich warten lässt, hat der Sampler gerade keine Chance zum Laufen bekommen (vor allem, wenn Sie eine enge Schleife haben und auf einem Low-End-Rechner laufen).

Während das Sampling keine genaue Anzahl an Aufrufen liefert, gibt es genügend Informationen, um festzustellen, welche Methoden am meisten Zeit und CPU verbrauchen, damit Sie den Code optimieren können.

0

Zu wenige Aufrufe, JFR-Proben Zuweisungen und Methodenaufrufe, um den Overhead gering zu halten. Er tastet die Stapel etwa einmal alle 10 ms und Zuordnungen an jedem TLAB ab (lokaler Thread-Zuweisungspuffer) oder wenn ein großes Objekt zugewiesen wird.

Der JIT-Compiler kann auch die Zuweisung/den Aufruf eliminieren, aber es erfordert normalerweise mehr als 40 Aufrufe bevor es passiert.

+0

Ich glaube nicht, JIT-Compiler den Aufruf beseitigt, weil ich dort diese Zeile setzen msgSeqNum = message.getMsgSeqNum(); msgSeqNum ist eine globale Variable. Ich bin mir nicht sicher, ob es richtig ist, die Beseitigung zu vermeiden, was denkst du? – ViKo

Verwandte Themen