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.
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. ..
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.
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
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
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.
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.
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!
Recommended Posts