Profiler HPROF verwenden

HPROF ist ein Demo-Profiler, der mit dem IBM® SDK ausgeliefert wird und JVMTI verwendet, um Informationen zur Java™ -Ausführung zu erfassen und aufzuzeichnen. Mithilfe von HPROF können Sie herausfinden, welche Teile eines Programms den meisten Hauptspeicher oder die meiste Prozessorzeit in Anspruch nehmen.

Damit Sie die Effizienz Ihrer Anwendungen verbessern können, müssen Sie wissen, welche Teile des Codes besonders viele Speicherkapazitäten und Prozessorressourcen belegen. HPROF ist ein JVMTI-Beispielagent, der mit folgender Syntax gestartet wird:
java -Xrunhprof[:<option>=<value>,...] <classname>

Wenn Sie Java mit HPROF ausführen, wird eine Datei erstellt, wenn das Programm beendet wird. Diese Datei wird im aktuellen Arbeitsverzeichnis abgelegt und heißt java.hprof.txt (java.hprof, falls Binärformat verwendet wird), sofern kein anderer Dateiname festgelegt wird. Die Datei besteht aus mehreren unterschiedlichen Abschnitten, wobei das genaue Format und der genaue Inhalt von den ausgewählten Optionen abhängig sind.

Wenn Sie mehr Informationen zu HPROF als in diesem Abschnitt enthalten benötigen, finden Sie weitere Informationen unter https://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html.

Der Befehl java -Xrunhprof:help zeigt die verfügbaren Optionen an:

heap=dump|sites|all
Diese Option hilft bei der Analyse der Speicherbelegung. Sie sorgt dafür, dass HPROF Stack-Traces erzeugt, denen Sie entnehmen können, wo Hauptspeicher zugeordnet wird. Bei Angabe der Option heap=dump erhalten Sie einen Speicherauszug von allen Liveobjekten im Heapspeicher. Mit heap=sites erhalten Sie eine sortierte Liste von Sites, wobei die Objekte mit den größten Speicherzuordnungen am Anfang der Liste stehen. Der Standardwert all bewirkt, dass beide Ausgabetypen erstellt werden.
cpu=samples|times|old
Die Option cpu stellt Informationen bereit, mit deren Hilfe Sie ermitteln können, wofür der Prozessor die meiste Zeit aufwendet. Wenn cpu auf samples gesetzt wird, unterbricht die JVM die Ausführung und gibt an, welcher Methodenaufruf gerade aktiv ist. Ist die Stichprobenrate hoch genug, erhalten Sie eine gutes Bild davon, wofür Ihr Programm die meiste Zeit verbraucht. Wenn cpu auf times gesetzt wird, erhalten Sie genaue Messwerte darüber, wie oft jede einzelne Methode aufgerufen wurde und wie lange jede einzelne Ausführung gedauert hat. Diese Option liefert zwar genauere Informationen, verlangsamt aber das Programm. Wenn cpu auf old gesetzt wird, werden die Profilermittlungsdaten im alten HPROF-Format erstellt.
interval=y|n
Die Option 'interval' gilt nur bei cpu=samples und steuert die Zeit, die der Thread für Stichprobenentnahmen zwischen den Stichproben des Thread-Stacks pausiert.
monitor=y|n
Mithilfe der Option monitor können Sie nachvollziehen, wie sich die Synchronisation auf die Leistung Ihrer Anwendung auswirkt. Monitore implementieren die Threadsynchronisation. Den Informationen zu Monitoren können Sie entnehmen, wie viel Zeit verschiedene Threads mit dem Versuch verbringen, auf bereits gesperrte Ressourcen zuzugreifen. HPROF liefert außerdem eine Momentaufnahme der verwendeten Monitore. Diese Informationen sind zur Erkennung von Deadlocks hilfreich.
format=a|b
Das Standardformat für die Ausgabedatei ist ASCII. Setzen Sie format auf 'b', wenn Sie ein Binärformat angeben möchten, das für einige Dienstprogramme wie das Heapspeicheranalysetool erforderlich ist.
file= < Dateiname>
Mit der Option file können Sie den Namen der Ausgabedatei ändern. Der Standardname für eine ASCII-Datei lautet java.hprof.txt. Der Standardname für eine Binärdatei lautet java.hprof.
force=y|n
Bei der Standardeinstellung (force=y) werden üblicherweise alle vorhandenen Informationen in der Ausgabedatei überschrieben. Geben Sie deshalb force=n an, wenn mehrere JVMs aktiv sind und HPROF aktiviert ist, denn dann werden bei Bedarf zusätzliche Zeichen an den Ausgabedateinamen angehängt.
net= < Host>: < Port>
Wenn Sie die Ausgabe nicht in einer lokalen Datei speichern, sondern über das Netz senden möchten, verwenden Sie die Option net.
depth= < Größe>
Die Option depth gibt die Anzahl der Methodenframes an, die in einem Stack-Trace angezeigt werden sollen. Der Standardwert ist '4'.
thread=y|n
Wenn Sie die Option thread auf y setzen, wird neben jedem Trace die Thread-ID ausgegeben. Diese Option ist hilfreich, wenn Sie nicht sehen können, welcher Thread welchem Trace zugeordnet ist. Ein solches Problem kann in einer Multithread-Anwendung auftreten.
doe=y|n
Das Standardverhalten besteht darin, dass Profilinformationen beim Schließen einer Anwendung erfasst werden. Wenn die Profilermittlungsdaten während der Ausführung erfasst werden sollen, setzen Sie doe (dump on exit) auf n.
msa=y|n
Dieses Feature wird auf IBM SDK-Plattformen nicht unterstützt.
cutoff= < Wert>
Viele Stichprobeneinträge werden für einen kleinen Prozentsatz der gesamten Ausführungszeit erstellt. HPROF schließt standardmäßig alle Ausführungspfade ein, die mindestens 0,0001 Prozent der vom Prozessor verbrauchten Zeit entsprechen. Diesen Grenzwert können Sie mithilfe dieser Option erhöhen oder verringern. Sie können beispielsweise alle Einträge unterdrücken, die weniger als einem Viertelprozent der gesamten Ausführungszeit entsprechen, indem Sie cutoff=0.0025 angeben.
verbose=y|n
Diese Option generiert eine Nachricht, wenn Speicherauszüge erstellt werden. Der Standardwert ist y.
lineno=y|n
Jeder Frame schließt normalerweise die Zeilennummer ein, die verarbeitet wurde. Sie können diese Option jedoch nutzen, um die Zeilennummern in der Ausgabeliste zu unterdrücken. Ist die Option aktiviert, enthält jeder Frame den Text Unknown line (Unbekannte Zeile) anstelle der Zeilennummer.
TRACE 1056:
java/util/Locale.toUpperCase(Locale.java:Unknown line)
java/util/Locale.<init>(Locale.java:Unknown line)
java/util/Locale.<clinit>(Locale.java:Unknown line)
sun/io/CharacterEncoding.aliasName(CharacterEncoding.java:Unknown line)