[JAVA] Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können

OpenJDK-Distributionen (im Folgenden Java oder JDK), die das Oracle JDK enthalten, verfügen über verschiedene Analysetools / -mechanismen, einschließlich JFR.

Es gibt einige Teile, in denen sich der Trend von JDK7 zu JDK12 geändert hat, daher werde ich eine kleine schlampige Notiz schreiben.

Mechanismus zum Erfassen von Metriken

Java bietet verschiedene Möglichkeiten, um Leistungsmetriken abzurufen. Die folgenden drei sind typisch.

JMX

Java Management Extensions (JMX) ist ein Protokoll zur Überwachung und Verwaltung von Java-Ressourcen. Einfach gesagt, es ist die Java-Version von SNMP. Importiert aus Java 1.5 als JSR-174.

Es ist auch möglich, Managed Beans (MBeans) zu verwenden, um CPU- und Speicherinformationen abzurufen und bestimmte Ereignisse auszuführen (z. B. erzwungene GC).

Sie können MBeans auch selbst definieren. Da es sich um eine Technologie handelt, die ursprünglich mit Java EE gestartet wurde, können viele Anwendungscontainer wie Weblogic und GlassFish verschiedene Metriken wie die Anzahl der Threads und die Anzahl der Warteanforderungen mit JMX erfassen. Ich werde. Daher ist es die grundlegendste Wahl bei der Überwachung von Java-Anwendungen.

In den letzten Jahren sind jedoch Jolokia, ein OSS, das JMX in HTTP-Basis konvertiert, und Eclipse Microprofile Metrics, eine neue Schnittstelle zur Metrikerfassung, die JMX ersetzt, erschienen, da es schwierig ist, eine Verbindung mit der Seite des Überwachungstools des ursprünglichen Protokolls herzustellen. ..

Java-Protokoll

In Java können detaillierte Protokolle wie GC von JVM abgerufen werden. Ursprünglich wurde Java entwickelt, um verschiedene Systemprotokolle mit dem Versions-Upgrade zu erfassen. Es war jedoch inkonsistent und es war erforderlich, jedes Protokollformat und jede Einstellungsmethode zu lernen.

Seit JDK 9 sind die Spezifikationen für die Systemprotokollierung jedoch als Unified JVM-Protokollierung integriert. Infolgedessen hat sich der Komfort verbessert, aber die Optionen usw. unterscheiden sich von denen in Java 8. Seien Sie also vorsichtig, wenn Sie alte Dokumente anzeigen.

Wenn es sich beispielsweise um ein GC-Protokoll handelt, wird es in die Protokolldatei ausgegeben, indem Sie es in der JVM-Option wie unten gezeigt angeben.

-Xlog:gc*=debug:/path/to/gc_%p_%t.log:time,level,tags:filesize=100m,filecount=7

Möglicherweise möchten Sie auch regelmäßig Thread-Dumps in Ihrer Protokolldatei haben. Dies ist jedoch mit der Protokollierungsfunktion der JVM nicht möglich. Daher war es üblich, einen Befehl zum Schreiben in eine Datei durch periodisches Ausführen von "jstack", "jcmd" oder "kill -3" zu erstellen, was später beschrieben wird.

Wenn Sie jedoch JFR verwenden, ist der Stack-Trace auf der JFR-Seite enthalten, sodass dies ausreicht.

JPLIS(javaagent)

Java Programming Language Instrumentation Services (JPLIS) ist eine Schnittstelle für die Arbeit mit unbekannten Paketen namens "java.lang.instrument". Es wird verwendet, indem "javaagent" als JMV-Option angegeben wird.

Dies ist eine API, in der der Agent die Klasseninformationen neu schreibt, wenn die JVM die Klasse lädt. Sie können dies verwenden, um Java-Objektinformationen abzurufen, oder einen Aspekt für die Profilerstellung einbetten, um Ablaufverfolgungsinformationen abzurufen.

Der Nachteil ist, dass es nur wenige Materialien gibt, die jedoch in Kombination mit AspectJ relativ einfach zu verwenden sind.

Viele APMs werden mit diesem Java-Agenten implementiert, da im Prinzip fast jeder Wert angenommen werden kann. Aufgrund der Eigenschaften des Umschreibens des Bytecodes besteht jedoch die Gefahr, dass ein Fehler verursacht wird, bei dem die Ursache in einem weiten Bereich schwer zu identifizieren ist. Testen / debuggen Sie daher sorgfältig, bevor Sie ihn verwenden.

JDK-Standardwerkzeuge

Es gibt Tools von Drittanbietern, aber Java bietet standardmäßig Tools für Analyse und Diagnose. VisualVM und JMC sind aufgrund der Öffnung nicht mehr im Oracle JDK enthalten, diesmal werden wir sie jedoch in die Standardtools aufnehmen.

VisualVM

Das Flaggschiff-Profiling-Tool von HotSpot, bis Java Mission Control in das JDK integriert wurde. Die OSS-Version wird unten entwickelt.

https://visualvm.github.io/index.html

01-02-visualvm.png

Eine der Funktionen ist, dass es eine Plug-In-Struktur hat, da es auf der NetBeans-Plattform basiert.

Sie können JMX-Informationen überwachen und verschiedene Informationen wie CPU und Speicher / GC in Echtzeit und grafisch anzeigen. Es ist auch ein sehr ausgeklügeltes Tool, das Heap-Dumps ausgibt und Schnappschüsse von Analyseinformationen erstellt.

Es wurde ein wenig überschattet, seit JMC auch in HotSpot enthalten war, aber es ist auch mit GraalVM kompatibel, und es scheint, dass die neueste Version mit JFR kompatibel ist, obwohl es sich um eine Vorschau-Version handelt. Daher ist es ein Tool, um das man sich in Zukunft erneut Sorgen machen muss. ist.

JDK Mission Control(JMC)

Es ist heute das gängige Profiling-Tool in Java. Die OSS-Version wird unten entwickelt.

https://github.com/JDKMissionControl/jmc

01-02-jmc.png

Ursprünglich als JRockit Mission Control bezeichnet, ist es ein Tool, das das in JRockit nach der Übernahme von Sun durch Oracle etablierte Profiling-Tool in HotSpot integriert.

Auch eng verbunden mit JFR von JRockit abgeleitet. .. .. Tatsächlich ist es als JFR-Visualisierungstool fast eine Option.

Als Funktion ist es ein integriertes Analysetool ähnlich Visual VM, und JMX-Überwachung in Echtzeit, Heap-Dump und JFR-Erfassung / -Analyse sind möglich.

Es basiert im Gegensatz zu VisualVM auf dem GUI-Framework von Eclipse und verfügt über flexible Plug-In-Funktionen. Eine der Funktionen ist, dass es Plug-Ins gibt, die auf Produkte wie Weblogic spezialisiert sind.

Der Name wurde aufgrund der Portierung auf HotSpot und OSS in "JRock it Mission Control" -> "Java Mission Control" -> "JDK Mission Control" geändert, die Abkürzung bleibt jedoch JMC.

Darüber hinaus hat sich die Benutzeroberfläche gegenüber dem geöffneten JMC 7 erheblich geändert und die automatische Analysefunktion wurde verbessert.

Derzeit ist die offizielle Version jedoch noch nicht veröffentlicht und die Binärdatei kann nicht von der offiziellen Version heruntergeladen werden. Daher ist es weiterhin erforderlich, sie selbst zu erstellen.

Derzeit ist es am besten, "OpenJDK Mission Control", "Zulu Mission Control" und "Liberica Mission Control" zu verwenden, die vom OpenJDK-Distributor entwickelt wurden.

jcmd

Jcmd ist wie JFR ein Befehl, der ursprünglich in JRockit verwendet wurde. Viele von Sun entwickelte Verwaltungstools wurden auch für HotSpot bereitgestellt. Da die Befehle jedoch unterschiedlich sind, ist es durch die Einführung von jcmd möglich geworden, eine konsistente Verwaltung durchzuführen.

Hauptsächlich können Sie "JFR-Operation", "Prozess abrufen", "Thread-Dump abrufen" usw. ausführen. Das Folgende sind typische Befehle.

Befehl Erläuterung
jcmd {Keine Argumente} Java-Prozessliste wie jps anzeigen
jcmd {Prozess ID} VM.version JDK-Versionsinformationen für den angegebenen Prozess anzeigen
jcmd {Prozess ID} VM.flags Alle in der JVM des angegebenen Prozesses angegebenen Optionen anzeigen, einschließlich der Standardwerte
jcmd {Prozess ID} Thread.print Holen Sie sich einen Thread-Dump des angegebenen Prozesses
jcmd {Prozess ID} GC.heap_dump {Name der Ausgabedatei}} Holen Sie sich einen Heap-Dump des angegebenen Prozesses
jcmd {Prozess ID} JFR.start {JFR-Option} Starten Sie die Aufnahme von JFR
jcmd {Prozess ID} JFR.dump {JFR-Option} Stoppt die Aufzeichnung während der Ausführung und gibt den aufgezeichneten Inhalt aus dem Umlaufpuffer in eine Datei aus
jcmd {Prozess ID} JFR.check Informationen zur JFR-Ausführung anzeigen
jcmd {Prozess ID} JFR.stop Beenden Sie die Aufnahme von JFR

JFR tool

JFR Tool ist ein neuer Befehl, der von JDK12 eingeführt wurde. Ein Tool zum Konvertieren von JFR-Dateien in JSON und XML sowie zum Aufteilen / Integrieren von JFR-Dateien.

Befehl Erläuterung
jfr print [--xml, --json]
[--categories {filter}]
[--events {filter}]
[--stack-depth {depth}]
{Dateiname}
Gibt die angegebenen Elemente in der JFR-Datei in einem beliebigen Format aus.
Das Ausgabeformat ist TEXT, XML,Wählen Sie aus JSON. Zielereignisse können durch Angabe von Kategorien und Ereignissen gefiltert werden. Mehrere Filter können durch Kommas getrennt angegeben werden.
jfr metadata {Dateiname} JFR-Metainformationen anzeigen
jfr summary {Dateiname} JFR-Zusammenfassungsinformationen anzeigen
jfr assemble {Repository-Name} {Dateiname} Kombinieren Sie mehrere JFR-Dateien im Repository zu einer JFR-Datei
jfr disassemble [--output {Verzeichnisname}]
[--max-chunks {Größe}]
[--max-size {Größe}]
{Dateiname}
指定したJFRファイルを任意のGrößeでディレクトリに分割して保存する

jfr print ist nützlich, wenn Sie JFR in ein anderes Tool anstelle von JMC integrieren möchten. Wenn beispielsweise GC-Informationen erfasst werden, wird eine große Menge des folgenden JSON ausgegeben.

$ jfr print --json --categories GC --events jdk.GCPhaseParallel sample.jfr
{
    "recording": {
        "events": [{
            "type": "jdk.GCPhaseParallel"
            ,
            "values": {
                "startTime": "2019-09-04T09:43:30.056871672-08:00",
                "duration": "PT0.000000518S",
                "eventThread": {
                    "osName": "GC Thread#5",
                    "osThreadId": 38915,
                    "javaName": null,
                    "javaThreadId": 0,
...

Darüber hinaus können verschiedene Verarbeitungen durchgeführt werden, indem das JSON-Ausgabeergebnis mit einer Pipe mit dem Befehl jq verbunden wird.

$ jfr print --json \
    --categories GC,Profiling,Processsor,Heap,MyApp \
    --events jdk.GCPhaseParallel,jdk.ExecutionSample,jdk.CPULoad,jdk.GCHeapSummary  \
    chunk.jfr \
|jq '.recording.events[]' | jq -c '.|= .+ {"Key": "Value"}'

{"type":"jdk.CPULoad","value":{"startTime":"2019-09-08T16:13:01.980014338-
08:00","jvmUser":0.23814254,"jvmSystem":0.019405695,"machineTotal":0.5409429},"Key":"
Value"}
...

Das Teilen und Verbinden durch "Zusammenbauen / Zerlegen" ist eine sehr bequeme Funktion während des Betriebs. Details werden in Kapitel 5 beschrieben. Mit dieser Funktion können Sie jedoch eine tägliche und stündliche Dateirotation und Sicherung von JFR Fal durchführen.

JDK Standard Tool (alte Version)

Es handelt sich um eine Gruppe von Tools, die in letzter Zeit nicht viel verwendet wurden, da neue alternative Tools erstellt wurden.

JConsole

JMX ist ein Profiling-Tool. Da es das schon lange gibt, wird es häufig als Werkzeug für Leistungstests in alten Büchern und Websites eingeführt.

JMX kann Informationen wie CPU, Heap, GC, Anzahl der Lastklassen usw. mit der Spezifikation SNMP für Java erfassen. Es ist ein gutes Tool mit einer einfachen Benutzeroberfläche, aber vor kurzem habe ich das Gefühl, meine Rolle beendet zu haben, weil ich mit VisualVM und JMC dasselbe tun kann.

hprof

Ein altes Java-Standard-Profiling-Tool. Sie können die CPU-Auslastung, Heap-Informationen, Heap-Dumps usw. abrufen / analysieren.

Es ist jedoch kein Typ, der mit einem erheblichen Overhead auf die Produktion angewendet werden kann. Während der Entwicklung und des Testens scheint der mit der IDE gelieferte Profiler jetzt einfacher zu verwenden zu sein.

jps

Dieser Befehl zeigt die Prozess-ID der JVM an. Unter Linux können Sie es natürlich mit dem Befehl ps identifizieren, aber es ist praktisch zum Filtern, da andere Prozesse als Java nicht angezeigt werden.

jstat

Dieser Befehl überprüft die Informationen des Heaps einschließlich GC. Die Speicherstruktur von Java weist verschiedene Hierarchien auf und ist kompliziert, kann jedoch überwacht werden.

jstack

Dieser Befehl ruft einen Thread-Dump der JVM ab.

Es wird häufig bei der Analyse von Thread-Sperren wie toten Sperren verwendet. Übergeben Sie den erworbenen Thread-Dump nicht allein, sondern zur Verwendung an "Samurai", "Thread Logic" und "TDA".

Da der Thread-Dump im Falle eines Fehlers eine wichtige Information ist, erstellen Sie ein Skript, das ihn regelmäßig ausführt, oder tippen Sie mehrmals darauf, wenn der Thread nicht abgerufen werden kann.

jmap

jmap ist ein Tool zum Abrufen von Heap-Dumps.

Sie können Prozessinformationen, Heap-Informationen, Klassenladeinformationen, Heap-Zusammenfassungen, Histogramme, statistische Informationen und verschiedene andere Informationen abrufen.

Die Ausgabe wird normalerweise mit jhat oder einem Drittanbieter-Tool analysiert. Jmap kann jedoch eine vollständige GC verursachen und sollte in der Produktion mit Vorsicht verwendet werden.

Zusammenfassung

Hier finden Sie eine kurze Zusammenfassung der Verwendung von Tools zur Metrikerfassung / -diagnose in Java. Ich denke nicht, dass es eine schlechte Idee ist, den alten Befehl zu verwenden, aber da die Operationen vereinheitlicht sind, ist es grundsätzlich sicher, den neuesten zu verwenden.

Insbesondere ist das JFR-Tool ein Tool, mit dem ich mich befasst habe, bevor ich es kannte, aber es ist sehr praktisch, daher möchte ich es aktiv nutzen.

Dann viel Spaß beim Hacken!

Referenz

Recommended Posts

Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können
Organisieren Sie Methoden, die mit StringUtils verwendet werden können
Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Firebase-Realtime-Datenbank für Android, die mit Kopie verwendet werden kann
Syntax- und Ausnahmebedingungen, die beim Vergleich mit null in Java verwendet werden können
Statisches Analysetool, das mit GitHub verwendet werden kann [Java-Version]
SwiftUI-Ansicht, die in Kombination mit anderen Frameworks verwendet werden kann
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Ruby-Array-Methoden, die mit Rails verwendet werden können (außer jedem)
[OpenJDK11 & JavaFX13] Erstellen Sie eine JavaFX-App mit IntelliJ + gradle und erstellen Sie ein Paket, das zusammen mit einer leichten JRE verteilt werden kann.
[Swift] Farbwähler, der zum Kopieren und Einfügen verwendet werden kann (Palette, mit der Sie Farben frei auswählen können)
Erstellt eine Umgebung, in der Kotlin mit Docker mit CLI kompiliert und mit Java ausgeführt werden kann
Bereich, in dem Variablen mit Ruby verwendet werden können [Scope]
Über die Sache, dass hidden_field wahnsinnig benutzt werden kann
Praktische Tastenkombinationen für Eclipse
Organisieren Sie Methoden, die mit StringUtils verwendet werden können
Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Einige Summen] Erhöhen Sie die Methoden, die verwendet werden können
Probleme, die leicht mit Java und JavaScript verwechselt werden können
Tools und Befehle, die für die Fehlerbehebung in Java hilfreich sein können
Kraftfertigkeiten, die jederzeit schnell eingesetzt werden können - Reflexion
Informationen zu Bereich und Umfang, in denen Day16-Variablen verwendet werden können
Zusammenfassung der JDKs, die mit Homebrew installiert werden können (Stand November 2019)