Il garbage collector di Java è un sistema automatico che si occupa di liberare la memoria dagli oggetti non più usati; liberando, così, i programmatori dal vincolo di dover allocare e dellocare gli oggetti in memoria.
Un oggetto è non più usato quando non è più refenziato ossia non c’è nessun riferimento, diretto e indiretto, a esso nei dati statici e nelle variabili del metodo in esecuzione.
Il Garbage Collector (GC) prima esegue un processo detto marcatura (marking), in cui identifica quali pezzi di memoria sono in uso e quali no.
Gli oggetti riferiti sono mostrati in blu. Gli oggetti senza riferimento sono mostrati in giallo. Dopodichè procede alla cancellazione degli oggetti senza riferimento.
Infine, gli oggetti referenziati vengono spostati in modo da renderli più compatti e veloci.
L’invocazione della GC dipende dalla particolare implementazione della JVM, quindi non è possibile sapere a priori quando agirà.
Il Metodo Finalize
Il metodo finalize è un metodo della classe Object che viene invocato dal GC su un oggetto quando il GC determina che non ci sono più riferimenti a quell’oggetto.
Viene usato per rilasciare delle risorse esterne a java (ad esempio file aperti), che potrebbero non essere gestite correttamente dal GC.
La dichiarazione del metodo finalize è del tipo:
protected void finalize() { //............................. }
Bisogna considerare che non si sa quando questo metodo viene eseguito, essendo l’invocazione della GC legata alla JVM. Inoltre, può capitare che l’oggetto abbia ancora qualche riferimento, quando GC si decide di ripulire la memoria. Per questi motivi, difficilmente si fa l’override di questo metodo per rilasciare delle risorse; si preferisce spesso usare try/finally.