Garbage Collection Protokollierung in einer Datei in Java

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.