Garbage Collection Registrazione in un file in Java

1. Panoramica

La garbage collection è una meraviglia del linguaggio di programmazione Java che ci fornisce la gestione automatica della memoria. La garbage collection nasconde i dettagli di dover allocare e rilasciare manualmente la memoria. Sebbene questo meccanismo sia fantastico, a volte non funziona nel modo desiderato. In questo tutorial, esploreremo le opzioni di registrazione di Java per le statistiche di garbage collection e scopriremo come reindirizzare queste statistiche a un file .

2. Flag di registrazione GC in Java 8 e versioni precedenti

Innanzitutto, esploriamo i flag JVM relativi alla registrazione GC nelle versioni Java precedenti a Java 9.

2.1. -XX: + PrintGC

Il flag -XX: + PrintGC è un alias per -verbose: gc e attiva la registrazione GC di base . In questa modalità, viene stampata una singola riga per ogni giovane generazione e per ogni collezione full-generation. Rivolgiamo ora la nostra attenzione alla fornitura di informazioni dettagliate sul GC.

2.2. -XX: + PrintGCDetails

Allo stesso modo, abbiamo il flag -XX: + PrintGCDetails utilizzato per attivare la registrazione GC dettagliata invece di -XX: + PrintGC .

Notare che l'output di -XX: + PrintGCDetails cambia a seconda dell'algoritmo GC in uso.

Successivamente, esamineremo l'annotazione dei nostri log con informazioni su data e ora.

2.3. -XX: + PrintGCDateStamps e -XX: + PrintGCTimeStamps

Possiamo aggiungere date e informazioni sui tempi ai nostri log GC utilizzando i flag -XX: + PrintGCDateStamps e -XX: + PrintGCTimeStamps , rispettivamente.

Innanzitutto, -XX: + PrintGCDateStamps aggiunge la data e l'ora della voce di registro all'inizio di ogni riga.

Secondo, -XX: PrintGCTimeStamps aggiunge un timestamp a ogni riga del registro specificando il tempo trascorso (in secondi) da quando è stata avviata la JVM.

2.4. -Xloggc

Infine, arriviamo a reindirizzare il registro GC a un file . Questo flag accetta un nome di file opzionale come argomento utilizzando la sintassi -Xloggc: file e senza la presenza di un nome di file il log GC viene scritto in uscita standard.

Inoltre, questo flag imposta anche i flag -XX: PrintGC e -XX: PrintGCTimestamps per noi. Vediamo alcuni esempi:

Se vogliamo scrivere il log GC sull'output standard, possiamo eseguire:

java -cp $CLASSPATH -Xloggc mypackage.MainClass

O per scrivere il log GC in un file, eseguiremmo:

java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass

3. Flag di registrazione GC in Java 9 e versioni successive

In Java 9+, -XX: PrintGC , l'alias per -verbose: gc , è stato deprecato a favore dell'opzione di registrazione unificata, -Xlog . Tutti gli altri flag GC menzionati sopra sono ancora validi in Java 9+. Questa nuova opzione di registrazione ci consente di specificare quali messaggi devono essere visualizzati, impostare il livello di registrazione e reindirizzare l'output .

Possiamo eseguire il comando seguente per vedere tutte le opzioni disponibili per livelli di registro, decoratori di registro e set di tag:

java -Xlog:logging=debug -version 

Ad esempio, se volessimo registrare tutti i messaggi GC in un file, eseguiremmo:

java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

Inoltre, questo nuovo flag di registrazione unificata è ripetibile, quindi puoi, ad esempio, registrare tutti i messaggi GC sia in uscita standard che in un file :

java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

4. Conclusione

In questo articolo, abbiamo mostrato come registrare l'output della garbage collection in Java 8 e Java 9+, incluso come reindirizzare l'output a un file.