Ricorda cos'è la raccolta dei rifiuti in Java
La Garbage Collection è il processo di recupero della memoria di runtime completa distruggendo gli oggetti inutilizzati.
A volte il programmatore può dimenticare di distruggere oggetti inutili e la memoria loro assegnata non viene liberata. Viene consumata sempre più memoria di sistema e alla fine non ne viene allocata altra. Tali applicazioni soffrono di "perdite di memoria".
Dopo un certo punto, non c'è più memoria sufficiente per creare nuovi oggetti e il programma termina in modo anomalo a causa di OutOfMemoryError .
La raccolta dei rifiuti in Java è il processo mediante il quale i programmi Java gestiscono automaticamente la memoria. I programmi Java sono compilati in bytecode che gira su Java Virtual Machine (JVM).
Quando i programmi Java vengono eseguiti sulla JVM, gli oggetti vengono creati sull'heap, che è la porzione di memoria ad essi assegnata.
Mentre un'applicazione Java è in esecuzione, vengono creati nuovi oggetti al suo interno. Alla fine, alcuni oggetti non servono più. Possiamo dire che in un dato momento la memoria dell'heap consiste di due tipi di oggetti.
- Live : questi oggetti vengono utilizzati, sono referenziati da qualche altra parte.
- Morto : questi oggetti non vengono utilizzati da nessun'altra parte, non ci sono riferimenti ad essi.
Il Garbage Collector trova questi oggetti inutilizzati e li rimuove per liberare memoria.
La raccolta dei rifiuti in Java è un processo automatico . Il programmatore non ha bisogno di contrassegnare in modo esplicito gli oggetti da eliminare.
Ogni JVM può implementare la propria versione di Garbage Collection. Tuttavia, il raccoglitore deve conformarsi alla specifica JVM standard per gestire gli oggetti presenti nella memoria heap per contrassegnare o identificare oggetti irraggiungibili e distruggerli tramite compattazione.
Raggiungibilità dell'oggetto
Per riconoscere un oggetto come vivo non basta la presenza di link. Questo perché alcuni oggetti morti possono riferirsi ad altri oggetti morti. Ecco perché è necessario che tra tutti i riferimenti a un oggetto, ce ne sia almeno uno da un oggetto “vivo”.
I Garbage Collector lavorano con il concetto di GC Roots ( Radici di Garbage Collection ) per distinguere tra oggetti vivi e morti. Ci sono oggetti vivi al 100% e da essi ci sono collegamenti che animano altri oggetti e così via.
Esempi di tali radici:
- Classi caricate dal caricatore di classi di sistema.
- Streaming in diretta.
- Parametri dei metodi attualmente in esecuzione e variabili locali.
- Oggetti utilizzati come monitor per la sincronizzazione.
- Oggetti che vengono conservati dalla Garbage Collection per qualche scopo.
- Il Garbage Collector esamina l'intero grafico degli oggetti in memoria, partendo da queste radici e seguendo i riferimenti ad altri oggetti.
Procedura di raccolta dei rifiuti in Java
L'implementazione standard della Garbage Collection prevede tre passaggi.
1. Contrassegna gli oggetti come attivi
A questo punto, il Garbage Collector (GC) deve identificare tutti gli oggetti viventi in memoria attraversando l'oggetto grafico.
Quando visita un oggetto, lo contrassegna come disponibile e quindi vivo. Tutti gli oggetti che non sono accessibili dalle radici del GC sono considerati candidati per la Garbage Collection.
2. Ripulire gli oggetti morti
Dopo la fase di markup, lo spazio della memoria è occupato da oggetti vivi (visitati) o morti (non visitati). La fase di pulizia libera i frammenti di memoria che contengono questi oggetti morti.
3. Disposizione compatta degli oggetti rimanenti in memoria
Non è necessario che gli oggetti morti rimossi nella fase precedente siano uno accanto all'altro. Pertanto, rischi di ottenere uno spazio di memoria frammentato (mezzo vuoto).
Ma, ovviamente, avendo provveduto a ciò, è possibile compattare la memoria nel momento in cui il garbage collector rimuove gli oggetti morti. Il resto si troverà in un blocco contiguo all'inizio dell'heap.
Il processo di compattazione semplifica l'allocazione sequenziale della memoria per i nuovi oggetti.
GO TO FULL VERSION