Warum VisualVM-Sampler liefert keine vollständigen Informationen über die CPU-Belastung (Methode, Zeitpunkt, Ausführung)?
Das problem ist: VisualVM-sampler zeigt die aufrufstruktur von Zeit. Für einige Methode sampler zeigt nur "Selbst mal" so kann ich nicht sehen, was macht diese Methode langsam. Hier ist ein Beispiel.
Wie erhöhe ich die Tiefe des profiling?
InformationsquelleAutor der Frage fedor.belov | 2011-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider sampling Profiler sind eher begrenzt, wenn es darum geht nach unten zu in-depth profiling aufgrund einer Reihe von Gründen:
Sampler sind begrenzt durch die Dauer der Probenahme: z.B. VisualVM hat derzeit einen minimalen abtastperiode von 20ms. Moderne Prozessoren führen mehrere Millionen Instruktionen in dieser Zeit - sicherlich mehr als genug, um mehrere kurze Methoden und Rückkehr von Ihnen.
Während eine naheliegende Lösung wäre die Verringerung der sampling-Periode, dies würde zu einer Erhöhung der Auswirkungen der profiler für Ihre Anwendung, präsentieren ein schönes Beispiel der Unschärferelation.
Sampler sind leicht zu verwechseln, indem inline-code: Sowohl der JVM und jeder anständige compiler inline trivial und/oder Häufig genannten Methoden, also die Einbeziehung Ihrer code in den code Ihrer Anrufer. Sampling-Profiler haben keine Möglichkeit zu sagen, welche Teile von jeder Methode, die eigentlich zu Ihr gehören und die gehören zu inline-Aufrufe.
Im Fall von VisualVM Selbst mal tatsächlich umfasst die Ausführungszeit sowohl die Methode als und alle inline-code.
Sampler bekommen kann verwirrt durch eine erweiterte VM: Zum Beispiel in der modernen JVM-Implementierungen von Methoden, die nicht über eine stabile Darstellung. Stellen Sie sich zum Beispiel folgende Methode:
Wenn die JVM startet
B()
interpretiert wird direkt aus dem bytecode, so dass durchaus ein bit der Zeit, die macht es sichtbar auf den sampler. Dann, nach einer Weile die JVM entscheidet, dassB()
ist ein guter Kandidat für die Optimierung und kompiliert native code, so dass es viel schneller. Und nach einer weiteren Weile, die JVM kann dann entscheiden, inline-AufrufB()
unter Einbeziehung dessen code inA()
.Am besten, eine sampling-profiler zeigt die Kosten für diese zuerst ausgeführt wird und dann die Kosten für alle nachfolgenden Läufe werden in der Zeit, die der Anrufer. Diese, leider verwirren kann ein unerfahrener Entwickler in Unterschätzung der Kosten des Verfahrens, der war eingebettet.
Im schlimmsten Fall, dass die Kosten zugeordnet werden können Geschwister rufen, anstatt der Anrufer. Zum Beispiel, ich bin derzeit profiling einer Anwendung mit VisualVM, wo ein hotspot scheint werden die
ArrayList.size()
Methode. In meiner Java-Implementierung, die Methode ist eine einfache Feld-getter dass jede JVM, sollte schnell inline. Doch der profiler zeigt, dass es sich als eine große Zeit der Verbraucher, völlig ignorieren eine Reihe von nahe gelegenenHashMap
Anrufe, die sind natürlich viel teurer.Die einzige Möglichkeit zur Vermeidung dieser Schwächen ist die Verwendung einer Instrumentierung profiler, eher als ein sampling ein. Instrumentierung profilers, wie Sie etwa durch die Profiler Registerkarte in VisualVM im wesentlichen erfassen jede und jeder Methode ein-und Ausstieg in den ausgewählten code. Leider Instrumentierung Profiler haben eine ziemlich schwere Auswirkung auf die profilierte code:
Legen Sie Ihre monitoring-code, um jede Methode, die völlig verändert die Art, wie eine Methode behandelt werden, die von der JVM. Auch einfache Feld-getter - /setter-Methoden können nicht inlined mehr wegen der zusätzlichen code, so neigen keine Ergebnisse. Die profiler in der Regel versucht, diese änderungen, aber es ist nicht immer erfolgreich.
Verursachen Sie massive slow-downs und die profilierte code, wodurch Sie völlig ungeeignet für die überwachung von kompletten Anwendungen.
Aus diesen Gründen Instrumentierung Profiler sind meist geeignet für die Analyse von hotspots, die bereits erkannt wurden mithilfe einer anderen Methode wie einer sampling-profiler. Durch die Instrumentierung nur eine ausgewählte Gruppe von Klassen und/oder Methoden ist es möglich, beschränken Sie die profiling-Seite-Effekte auf bestimmte Teile einer Anwendung.
InformationsquelleAutor der Antwort thkala
Es ist nichts falsch in dem Beispiel. Es sieht aus wie, dass
updateInfoInDirection()
Anrufenew SequenceInfo()
undSequenceInfo.next()
. "Self-time" bedeutet, dass die Zeit in den code der Methoden selbst (die MethodeupdateInfoInDirection()
ist auf der Unterseite des Stapels zu dem Zeitpunkt, wenn thread Probe genommen wurde).InformationsquelleAutor der Antwort Tomas Hurka