Java Performance Kapitel 3 Java Performance Toolbox

O'Reilly Japan \ -Java Performance Zusammenfassung von Kapitel 3 dieses Buches

Kapitel 1 Einführung \ -Qiita Kapitel 2 Ansatz für Leistungstests \ -Qiita ← Vorheriger Artikel Kapitel 3 Java Performance Toolbox --Qiita ← Dieser Artikel Kapitel 4 Mechanismus des JIT-Compilers \ -Qiita ← Nächster Artikel Kapitel 5 Grundlagen der Speicherbereinigung \ -Qiita

3.1 Tools und Analysen, die mit dem Betriebssystem geliefert werden

Das Tool ist zunächst ein Tool, das nichts mit Java zu tun hat.

Auf Unix-basierten Systemen sar command, vmstat, iostat //qiita.com/pyon_kiti_jp/items/a44ac6e9229ba7b90c6b) gibt es prstat, In Windows gibt es einen Typ perf.

CPU auslastung

Die CPU-Auslastung kann in die folgenden zwei Typen eingeteilt werden.

--Benutzerzeit: Die Zeit, zu der die CPU die Anwendung ausführt

Ziel ist es, die CPU-Auslastung zu maximieren und die Ausführungszeit zu verkürzen.

Die Ursache für den Leerlauf der CPU

Umgekehrt möchten Sie möglicherweise die CPU-Auslastung pro Programm begrenzen. In einem solchen Fall kann der CPU-Zyklus für einen bestimmten Zeitraum zwangsweise im Leerlauf sein oder die Priorität kann gesenkt werden.

CPU-Ausführungswarteschlange

Sowohl Windows- als auch Unix-Systeme verfügen über einen Mechanismus zum Überwachen von ausführbaren Threads (ohne auf E / A zu warten oder zu schlafen). Dieser Mechanismus heißt Warteschlange ausführen. In Windows wird es als Prozessorwarteschlange bezeichnet und kann mit typeperf angezeigt werden.

C:> typeperf -si 1 "\System\Processor Queue Length"
"05/11/2013 19:09:42.678","0.000000"
"05/11/2013 19:09:43.678","0.000000"

Da die Ausführungswarteschlange die aktuell ausgeführte enthält, muss sie ** 1 oder mehr ** sein. Andererseits enthält die Prozessorwarteschlange von Windows nicht die aktuell ausgeführte, sodass sie ** 0 oder mehr ** ist.

Die Leistung leidet, wenn mehr Threads ausgeführt werden als CPUs vorhanden sind. Unter Unix sollte die Anzahl der Ausführungswarteschlangen == die Anzahl der CPUs festgelegt werden, und unter Windows sollte die Länge der Prozessorwarteschlange 0 sein. Dies ist jedoch kein absolutes Prinzip. Wenn die Länge der Ausführungswarteschlange von Zeit zu Zeit zunimmt, gibt es kein Problem. Wenn andererseits die Ausführungswarteschlange weiterhin zu lang ist, erhöht sich die Belastung des Computers. Sie müssen den Prozess auf einen anderen Computer verteilen oder Ihren Code optimieren.

Festplattennutzung

Es ist ein Hinweis, um zu bestätigen, dass etwas nicht stimmt. Wenn beispielsweise die wMB / s (Anzahl der pro Sekunde geschriebenen Bytes) von "iostat -x" niedrig sind, die w / s (Anzahl der Schreibvorgänge pro Sekunde) jedoch groß ist, ist es möglicherweise besser, die Schreibvorgänge zu kombinieren, um eine bessere Leistung zu erzielen. Im Gegenteil, wenn zu viele Schreibvorgänge vorhanden sind, kann ein Engpass festgestellt werden.

Sie können sehen, ob das System austauscht. Kann die Leistung beeinträchtigen. In vmstat sehen Sie si (Swap In) und so (Swap Out).

Netzwerkauslastung

Standard-Systemtools sind für die Überwachung des Netzwerkverkehrs nicht ausreichend. Netstat wird auf Unix-basierten Systemen verwendet. Geben Sie perf unter Windows ein.

Für die Netzwerkbandbreite wird nicstat für Unix-basierte Systeme verwendet.

3.2 Java-Überwachungstool

--jcmd: Informationen zum angegebenen Prozess abrufen --jconsole: Sie können das Verhalten der JVM in der GUI sehen. --jhat: Sie können Heap-Dumps mit einem Webbrowser durchsuchen. --jmap: Sie können Heap-Dump- und Speicherinformationen abrufen. --jinfo: Kann JVM-Systemeigenschaften anzeigen --jstack: Den Stapel von Java-Prozessen sichern. --jstat: Zeigt Informationen zum Laden von GC und Klassen an. --jvisualvm: JVM-Überwachung. Kann Heap-Dumps analysieren.

Grundlegende Informationen zu JVM

Ausführungszeit

jcmd ${Prozess ID} VM.uptime

Systemeigenschaften

Sie können den gleichen Wert wie "System.getProperties ()" sehen (den Wert, den Sie beim Start "-Dhogehoge" angeben).

jcmd ${Prozess ID} VM.system_properties
jinfo -sysprops ${Prozess ID}

JVM-Version

jcmd ${Prozess ID} VM.version

JVM-Befehlszeilenargumente

jcmd ${Prozess ID} VM.command_line

JVM-Tuning-Flag

jcmd ${Prozess ID} VM.flags -all

Wenn Sie -all entfernen, ist es nur das angegebene?

Plattformspezifische Standardwerte anzeigen

java -XX:+PrintFlagsFinal -version

Für diejenigen mit: = wird ein anderer Wert als der Standardwert angegeben.

Dynamischer Flaggenwechsel

Zunächst sehen Sie alle in ↓ eingestellten Werte.

jinfo -flags ${Prozess ID}

Wenn Sie jedes Einstellungselement sehen möchten

jinfo -flag PrintGCDetails ${Prozess ID}

Beim Ändern des Einstellwertes

jinfo -flag -PrintGCDetails ${Prozess ID}
jinfo -flag PrintGCDetails ${Prozess ID}

Thread-Informationen

Sie können die Anzahl der auf der GUI ausgeführten Threads mit jconsole oder jvisualvm überprüfen.

So zeigen Sie den Thread-Stapel an

jstack ${Prozess ID}
jcmd ${Prozess ID} Thread.print

Klasseninformationen

Verwenden Sie jconsole oder jstat. jstat gibt Ihnen auch Informationen zur Kompilierung.

Dynamische Analyse der Speicherbereinigung

In jconsole kann die Heap-Nutzung grafisch angezeigt werden. Sie können GC mit jcmd ausführen (wie mit jconsole?) jmap gibt einen Überblick über den Heap. jstat bietet verschiedene Ansichten, die zeigen, was der GC tut.

Ex-post-Analyse von Heap-Dumps

Kann mit jvisualvm (GUI-Tool) oder jcmd oder jmap abgerufen werden Kann mit jvisualvm oder jhat analysiert werden, wenn es sich um ein Standardwerkzeug handelt Es gibt auch ein Drittanbieter-Tool namens Eclipse Memory Analyzer Tool.

3.3 Profiling Tool

Sampling-Profiler

Es gibt Sampling-Modus und Instrumented-Modus Da der Abtastmodus den geringsten Overhead aufweist, können die Leistungsmerkmale aufgrund von Profilerinterventionen minimiert werden.

Viele Stichprobenprofiler sind jedoch nicht genau. Zum Beispiel ein Ereignis, das regelmäßig von einem Timer aufgerufen wird und nur den Thread erkennt, der ausgeführt wurde, als der Timer auftrat.

In den meisten Fällen macht die Methode, die zu Beginn des Profilerstellungsergebnisses angezeigt wird, nur 2-3% aus. Wenn Sie also Ihr Bestes tun, um sie doppelt so schnell zu machen, ist sie möglicherweise nur 1% schneller.

instrumentierter Profiler

Im Gegensatz zum Stichprobentyp können Sie auch sehen, wie oft jede Methode aufgerufen wird und wie oft jede Methode durchschnittlich pro Sekunde aufgerufen wird. Daraus ist beispielsweise ersichtlich, ob die Implementierung beschleunigt oder verbessert werden sollte, um die Anzahl der Ausführungen zu verringern.

Der Profiler im instrumentierten Modus ist möglicherweise hinsichtlich der Leistung ungenau, da der Code, der die Anzahl der Anrufe zählt, im Bytecode neu geschrieben und aufgeladen wird. Beispielsweise kann sich die Größe des Methodencodes erhöhen und es kann festgestellt werden, dass Inlining nicht erforderlich ist (siehe Kapitel 4).

Sampling-Profiler können nur Threads profilieren, die sich an einem sicheren Punkt befinden (Speicher wird zugewiesen), Profiler im instrumentierten Modus jedoch.

Zeitleiste blockierter Methoden und Threads

Blockierungsmethoden (Wartemethoden wie LockSupport # park und Object # wait ()) verbrauchen keine CPU-Zeit (erhöhen die CPU-Auslastung nicht). Selbst wenn sie oben in den Profilerstellungsergebnissen angezeigt werden, können sie nicht optimiert werden. .. Daher zeigen die meisten Profiler standardmäßig keine blockierten Methoden an.

Bei der Blockierungsmethode können Sie das Verhalten anhand des Ausführungsstatus des Threads anzeigen. Für VisualVM die Registerkarte Threads.

Native Profiler

Mit einem nativen Profiler können Sie die JVM selbst profilieren.

Es gibt einen nativen Profiler namens Oracle Solaris Studio. Es heißt Solaris, funktioniert aber auch unter Linux.

Wenn Sie unter Solaris ausgeführt werden, können Sie die interne Struktur des Solaris-Kernels nutzen, um weitere Informationen zu erhalten.

Es gab eine solche Beschreibung. Ich habe keine Solaris-Maschine, daher kann ich sie nicht ausprobieren.

Daten, die nur mit nativen Tools abgerufen werden können, umfassen die für die GC aufgewendete Zeit.

3.4 Java Mission Control Es ist in der kommerziellen Version von Java unter dem Namen jmc enthalten, nicht in der Open Source-Version. Für die Nutzung ist eine kommerzielle Lizenz erforderlich.

JFR

Eine Funktion namens JFR (Java Flight Recorder) ist eine Schlüsselfunktion von jmc. Sie können das Ereignis sehen, z. B. die Thread-Blockierung.

Sie können Ereignisse im Zusammenhang mit der Speicherbereinigung in der JFR-Speicheransicht anzeigen. In den Kapiteln 5 und 6 sollten Sie lesen, während Sie sich darüber im Klaren sind, wie nützlich dieses Tool ist.

Auf der Registerkarte Übersicht der JFR-Codeansicht können Sie die aggregierten Werte für jedes Paket anzeigen. Es ist ungewöhnlich, diese Funktion zu haben.

Sie können auch genaue Informationen zum Sperren der Inflation erhalten. Darüber hinaus können Sie Informationen abrufen, die mit jcmd oder jconsole nicht abgerufen werden können.

Aktivieren Sie JFR

Um es zu aktivieren, in der Befehlszeile, die die Anwendung startet -XX:+UnlockCommercialFeatures -XX:+FlightRecorder Wird eine Flagge gegeben.

JFR kann zwei Aufnahmemethoden verwenden. Es gibt eine kontinuierliche Aufzeichnung für einen bestimmten Zeitraum, und ein Ringpuffer wird für die kontinuierliche Aufzeichnung verwendet.

Sie können angeben, wie mit Parametern wie -XX: + FlightRecorderOptions = $ {parameter string} aufgezeichnet werden soll. Optionen werden hier beschrieben [https://docs.oracle.com/javacomponents/jp/jmc-5-4/jfr-runtime-guide/comline.htm#BABJEIEH].

Sie können die laufende JVM auch mit dem folgenden Befehl einstellen (obwohl die Option -XX: + FlightRecorder im Voraus angegeben werden muss).

jcmd ${Prozess ID} JFR.start [Möglichkeit]

Für die kontinuierliche Aufzeichnung können die Daten im Ringpuffer mit dem folgenden Befehl in eine Datei ausgegeben werden.

jcmd ${Prozess ID} JFR.dump [Möglichkeit]

Informationen über die ausgeführte Aufnahme können mit dem folgenden Befehl ausgegeben werden (Übrigens scheinen mehrere Aufnahmen in einem Prozess gemacht werden zu können, daher frage ich mich, ob sie häufig verwendet werden, wenn mehrere Aufnahmen gemacht werden).

jcmd ${Prozess ID} JFR.check [verbose]

Beenden Sie bei ↓ die Aufnahme.

jcmd ${Prozess ID} JFR.stop [Möglichkeit]

JFR-Ereignisauswahl

JFR kann erweitert werden. Es scheint, dass Sie Ihr eigenes Ereignis erstellen können. Das Sammeln von Ereignissen ist zwangsläufig mit Overhead verbunden. Es gibt jedoch einige Ereignisse, die Sie erhalten möchten, auch wenn Overhead besteht. Überwachen Sie beispielsweise TLAB-Ereignisse (Thread Local Area Buffer) und prüfen Sie, ob Objekte direkt dem alten Bereich zugeordnet sind.

Recommended Posts

Java Performance Kapitel 3 Java Performance Toolbox
Java-Leistung Kapitel 1 Einführung
Java-Leistung Kapitel 2 Ansatz für Leistungstests
Java-Leistung Kapitel 5 Grundlagen der Garbage Collection
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
Leistungsoptimierung für Java-Apps
45 Techniken zur Optimierung der Java-Leistung (Teil 1)
Ich habe Java Gold gestartet (Kapitel 1-1)
Effektive Java 3rd Edition Kapitel 5 Generika
Java
Effektive Java 3rd Edition Kapitel 8 Methoden
Java
GraalVM für Java-Leistung (Windows Developer Build)
Leistungseinbußen bei Java-Containern in der Menicoa-Umgebung
[Java] Ist die Reflexion wirklich schwer? Leistungsvergleich
[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
Deep Learning Java von Grund auf neu Kapitel 2 Perceptron
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein