1. Übersicht
Die Garbage Collection ist ein Wunderwerk der Java-Programmiersprache und bietet uns eine automatische Speicherverwaltung. Die Speicherbereinigung verbirgt die Details der manuellen Zuweisung und Freigabe von Speicher. Obwohl dieser Mechanismus fantastisch ist, funktioniert er manchmal nicht so, wie wir es wollen. In diesem Lernprogramm werden die Protokollierungsoptionen von Java für Garbage Collection-Statistiken erläutert und erläutert, wie diese Statistiken in eine Datei umgeleitet werden .
2. GC-Protokollierungsflags in Java 8 und früheren Versionen
Lassen Sie uns zunächst die JVM-Flags untersuchen, die sich auf die GC-Protokollierung in Java-Versionen vor Java 9 beziehen.
2.1. -XX: + PrintGC
Das Flag -XX: + PrintGC ist ein Alias für -verbose: gc und aktiviert die grundlegende GC-Protokollierung . In diesem Modus wird für jede junge Generation und jede Sammlung der gesamten Generation eine einzelne Zeile gedruckt. Wenden wir uns nun der Bereitstellung detaillierter GC-Informationen zu.
2.2. -XX: + PrintGCDetails
In ähnlicher Weise haben wir das Flag -XX: + PrintGCDetails , mit dem die detaillierte GC-Protokollierung anstelle von -XX: + PrintGC aktiviert wird .
Beachten Sie, dass sich die Ausgabe von -XX: + PrintGCDetails abhängig vom verwendeten GC-Algorithmus ändert.
Als Nächstes werden wir unsere Protokolle mit Datums- und Uhrzeitinformationen versehen.
2.3. -XX: + PrintGCDateStamps und -XX: + PrintGCTimeStamps
Wir können unseren GC-Protokollen Datums- und Zeitinformationen hinzufügen , indem wir die Flags -XX: + PrintGCDateStamps bzw. -XX: + PrintGCTimeStamps verwenden.
Zunächst fügt -XX: + PrintGCDateStamps das Datum und die Uhrzeit des Protokolleintrags am Anfang jeder Zeile hinzu.
Zweitens: -XX: PrintGCTimeStamps fügt jeder Zeile des Protokolls einen Zeitstempel hinzu, in dem die seit dem Start der JVM verstrichene Zeit (in Sekunden) angegeben ist.
2.4. -Xloggc
Schließlich werden wir das GC-Protokoll in eine Datei umleiten . Dieses Flag verwendet einen optionalen Dateinamen als Argument unter Verwendung der Syntax -Xloggc: file und ohne das Vorhandensein eines Dateinamens wird das GC-Protokoll in den Standardausgang geschrieben.
Zusätzlich setzt dieses Flag auch die Flags -XX: PrintGC und -XX: PrintGCTimestamps für uns. Schauen wir uns einige Beispiele an:
Wenn wir das GC-Protokoll in die Standardausgabe schreiben möchten, können wir Folgendes ausführen:
java -cp $CLASSPATH -Xloggc mypackage.MainClass
Oder um das GC-Protokoll in eine Datei zu schreiben, würden wir Folgendes ausführen:
java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass
3. GC-Protokollierungsflags in Java 9 und höher
In Java 9+ wurde -XX: PrintGC , der Alias für -verbose: gc , zugunsten der einheitlichen Protokollierungsoption -Xlog veraltet . Alle anderen oben genannten GC-Flags sind in Java 9+ weiterhin gültig. Mit dieser neuen Protokollierungsoption können wir festlegen, welche Nachrichten angezeigt werden sollen, die Protokollstufe festlegen und die Ausgabe umleiten .
Mit dem folgenden Befehl können Sie alle verfügbaren Optionen für Protokollebenen, Protokolldekoratoren und Tag-Sets anzeigen:
java -Xlog:logging=debug -version
Wenn wir beispielsweise alle GC-Nachrichten in einer Datei protokollieren möchten, führen wir Folgendes aus:
java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass
Darüber hinaus ist dieses neue einheitliche Protokollierungsflag wiederholbar, sodass Sie beispielsweise alle GC-Nachrichten sowohl im Standardausgang als auch in einer Datei protokollieren können :
java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass
4. Fazit
In diesem Artikel haben wir gezeigt, wie die Ausgabe der Speicherbereinigung sowohl in Java 8 als auch in Java 9+ protokolliert wird, einschließlich der Umleitung dieser Ausgabe in eine Datei.