Java Garbage Collector

Da Andreabont's Wiki.

Java è un linguaggio basato sul garbage collection. E' possibile selezionare l'algortimo di garbage collection da usare e suoi eventuali parametri prima dell'esecuzione. Questo può essere molto utile allo scopo di ottimizzare le risorse e le prestazioni.

Parametri

Opzioni globali

Opzione Utilizzo
-Xms Seleziona la dimensione iniziale dell'heap. (-Xms100m)
-Xmx Seleziona la dimensione massima dell'heap. (-Xmx100m)
-Xmn Seleziona dimensione (iniziale e massima) della young generation. (-Xmn100m)
-verbose:gc Visualizza eventi del garbage collector.
-Xloggc:garbage-collection.log Scrive eventi del garbage collector sul file specificato.
-Xnoclassgc Disabilita il garbage collector per le classi.

Opzioni specifiche

Opzione Utilizzo
-XX:ParallelGCThreads=<num> Seleziona il numero di thread da usare (solo GC paralleli)

Algoritmi disponibili per il garbage collection

-XX:+UseSerialGC

Questo GC utilizza un solo thread per gestire la memoria. Quando si attiva blocca l'esecuzione dell'applicazione, ottimizza la memoria e successivamente ripristina l'esecuzione dell'applicazione dal punto in cui si era fermata. E' un GC molto semplice e adatto ad essere eseguito su macchine single-core, ma di contro causa dei blocchi nell'esecuzione che molto spesso sono percepibili dall'utente.

-XX:+UseParallelGC

Questo GC utilizza più thread per eseguire le operazioni di pulizia e ottimizzazione della memoria. Come quello seriale blocca l'esecuzione delll'applicazione durante la sua esecuzione, per poi ripristinarla a lavoro finito. Questa versione utilizza più thread solo per le operazioni sulla Young Generation.

-XX:+UseParallelOldGC

Identico al GC parallelo sopra descritto, abilita il multi-thread anche per la Permanent Generation.

-XX:+UseConcMarkSweepGC

Molto simile al GC parallelo il Concurrent Mark Sweep (CMS) GC cerca di minimizzare i tempi di sospensione dell'esecuzione dell'applicazione facendo gran parte del lavoro in parallelo durante l'esecuzione. Questo GC richiede un'uso più intensivo dell CPU, ma garantisce una esecuzione più fluida rispetto agli altri GC.

-XX:+UseG1GC

Il G1 GC è pensato come evoluzione del CMS per casi di applicazioni che richiedono tanta memoria. Anche lui è pensato per minimizzare gli stop di esecuzione allo stretto necessario.

Finalize

E' possibile definire un metodo finalize in una classe che venga richiamato quando il garbage collector decide di deallocare l'oggetto. Dato che non è possibile determinare il momento in cui il GC decide di deallocare, non è si può sapere se e quando il metodo finalize verrà chiamato.

private class Garbage {

    public Garbage() {
        System.out.println("Creato");
    }

    public void finalize() {
        System.out.println("Distrutto");
    }

}