Esistono due tipi principali di algoritmi di Garbage Collection in Java: Full Garbage Collection e Incremental Garbage Collection.
Full Garbage Collection o Major Garbage Collection
La garbage collection è un processo in cui un garbage collector (una parte del sistema di runtime di un linguaggio di programmazione) cerca in tutta la memoria utilizzata da un programma e compila tutti gli oggetti che non vengono più utilizzati dal programma. Questi oggetti vengono quindi contrassegnati come dati inutilizzati e possono essere rimossi dalla memoria.
La full garbage collection in genere viene eseguita dal sistema runtime di un linguaggio di programmazione che utilizza la gestione automatica della memoria, come Java o Python. Durante il processo, il garbage collector mette in pausa l'esecuzione del programma per eseguire la ricerca di dati inutilizzati, il che può comportare un rallentamento temporaneo delle prestazioni del programma.
La full garbage collection viene solitamente attivata quando la quantità di memoria utilizzata da un programma raggiunge una determinata soglia o quando il programma richiede un nuovo blocco di memoria e non c'è abbastanza memoria libera disponibile. L'obiettivo della full garbage collection è recuperare la memoria non necessaria al programma, rendendola disponibile per l'uso da altre parti del programma o da altri programmi in esecuzione sulla stessa macchina.
Incremental Garbage Collection o Minor Garbage Collection
L'incrementale garbage collection è un tipo di tecnica di gestione della memoria utilizzata dai linguaggi di programmazione e dagli ambienti di runtime per recuperare automaticamente la memoria non più necessaria a un programma. Lo fa individuando gli oggetti in memoria che non vengono utilizzati e liberando la memoria che occupano in modo che possa essere riutilizzata da altre parti del programma.
Nella incremental garbage collection, il garbage collector analizza periodicamente la memoria del programma alla ricerca di oggetti irraggiungibili nella memoria heap delle giovani generazioni. Invece di interrompere l'esecuzione del programma durante questo processo di scansione, il garbage collector divide il processo di scansione in parti piccole e gestibili chiamate "incrementi". Durante ogni incremento, il garbage collector analizza una parte della memoria del programma, individuando gli oggetti non necessari e contrassegnandoli come disponibili per il riutilizzo.
Utilizzando gli incrementi, il garbage collector può recuperare la memoria in piccoli pezzi, senza interrompere l'esecuzione del programma per un periodo prolungato. Questo aiuta a garantire che il programma rimanga reattivo e non subisca pause o ritardi significativi a causa del processo di raccolta di dati inutilizzati.
Tuttavia, l'incremental garbage collection può essere meno efficiente di altri tipi di tecniche di garbage collection, come mark-and-sweep o generational garbage collection, in quanto richiede scansioni più frequenti della memoria del programma. Inoltre, l'utilizzo degli incrementi può introdurre un certo sovraccarico nell'esecuzione del programma, poiché il garbage collector deve mantenere le informazioni sullo stato tra ogni incremento.