Che cos'è Java Garbage Collector?
Il garbage collector è un thread demone che libera la memoria durante il runtime. La raccolta dei rifiuti può anche essere espressa come riciclaggio della memoria. Soprattutto in JVM, il raccoglitore di rifiuti hotspot oracolo viene utilizzato per la sua efficienza. L'area di memoria in JVM in cui vengono creati gli oggetti si chiama heap. L'heap è diviso in due parti:
- Spazio per giovani generazioni
- Spazio di generazione vecchio / di ruolo
La giovane generazione è di nuovo divisa in 3 parti
- Spazio Eden
- Sopravvissuto da
- Sopravvissuto a
Una spiegazione più approfondita è stata data nei prossimi punti. Ad esempio, se hai creato una cache nel tuo programma e se l'oggetto cache è sopravvissuto a molti cicli di GC, passa alla vecchia generazione. Il GC cerca oggetti che non sono più necessari al programma e li distrugge.
Perché Garbage Collector?
Prima di Java, due dei linguaggi più popolari erano il C e il C ++. In C ci siamo imbattuti in calloc (), malloc (), realloc () che allocerà la memoria buffer e in C ++ abbiamo distruttori. Tutte queste funzioni sono per la funzione chiamata gestione della memoria. Java fornisce Garbage Collector come gestione automatica della memoria per i due motivi principali:
- Alcuni oggetti creati diventano irraggiungibili
- I riferimenti da vecchi oggetti a giovani oggetti esistono solo in piccoli numeri.
La migliore pratica per utilizzare un Garbage Collector è impostare flag su JVM.
Lascia che ti faccia un esempio per oggetti non raggiungibili
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
Nell'esempio sopra, Java creerà un oggetto stringa e l'ambito di tale oggetto è solo se il blocco non può essere utilizzato all'esterno. Pertanto, quando la garbage collection scorre su questa classe, contrassegnerà "s" come oggetto non raggiungibile e inutilizzato e lo eliminerà.
Funzioni in Garbage Collector
- Segna: inizia dal nodo principale dell'applicazione (principale), cammina sul grafico degli oggetti, segna gli oggetti che sono raggiungibili come vita.
- Elimina / Sweep: elimina gli oggetti non raggiungibili. Quando GC elimina gli oggetti, crea un buco nell'heap rendendolo incoerente. Pertanto, viene utilizzata la compattazione.
- Compattazione: compatta la memoria spostando gli oggetti e contrassegnando l'allocazione contigua che frammentata. È un compito che richiede tempo.
Come funziona Java Garbage Collector?
- Esistono due tipi di oggetti:
Oggetti live: raggiungibili (riferimenti da un altro oggetto)
Oggetti morti: irraggiungibili (non referenziati da nessuna parte)
- Tutti gli oggetti appena creati vengono creati nello spazio Eden (spazio Young Generation).
- Quando lo spazio Eden è pieno, un programma minorGC () viene eseguito nello spazio Young Generation che segna tutti gli oggetti inutilizzati o morti e li cancella dalla memoria.
- Gli oggetti sopravvissuti a questo ciclo GC verranno spostati nello spazio Sopravvissuto. Lo stesso processo si ripete e questa volta quando gli oggetti vengono spostati dallo spazio Eden a Survivor Dallo spazio, GC verifica se è pieno, gli oggetti morti vengono rilasciati e anche gli oggetti sopravvissuti verranno spostati su Survivor.
- Questo processo si ripete e alcuni oggetti sono sopravvissuti a una soglia no di cicli GC, questi oggetti vengono spostati nello spazio di vecchia generazione.
- In questo scenario, JVM esegue la funzione majorGC () che attraversa lo spazio heap completo, identifica / contrassegna oggetti non utilizzati (nulli o morti) e sposta tutti questi oggetti.
- Ricorda, spazzare oggetti dallo spazio dell'heap creerà buchi nella memoria causando una perdita di memoria. Per evitare questo scenario, Garbage Collector implementa la compattazione dello spazio di memoria
Esempi di Garbage Collector in Java
Esempio di system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Produzione:
Oggetto
Spiegazione del codice sopra
- Nel codice sopra, i due oggetti obj1 e obj2 puntano a null, quindi vengono memorizzati nello spazio Eden con valori null e non referenziati
- System gc () invocherà un thread demone della garbage collection ed entrambi gli oggetti verranno eliminati dallo spazio.
Pro e contro
Di seguito sono riportati alcuni pro e contro di Java Garbage Collector come segue:
Pro di gc:
- La garbage collection aumenta l'efficienza della memoria poiché eliminerà tutti gli oggetti non utilizzati e nulli
- Un Garbage Collector è un processo automatico, quindi lo sviluppatore potrebbe non occuparsene, perché in altre lingue senza un programmatore Garbage Collector deve occuparsi del problema della memoria inafferrabile.
Contro di gc:
- Il garbage collector eseguirà le principali funzioni gc che attraverseranno l'intero spazio dell'heap, accelerando lentamente il programma di alcuni secondi.
- Questo processo richiederà più tempo della CPU, rallentando il sistema di codice.
- Se stai lavorando su un'applicazione che richiede un'enorme memoria, fai uso dei flag JVM disponibili.
- Se lo spazio heap è pieno e gli oggetti non possono essere spostati o aggiunti ulteriormente, Java genera l'errore di memoria che rallenta l'intera applicazione e può anche causare perdite di memoria.
Articoli consigliati
Questa è una guida a Cos'è Java Garbage Collector ?. Qui discutiamo del suo funzionamento insieme a funzioni, esempi, pro e contro di Java Garbage Collector. Puoi anche consultare i seguenti articoli per saperne di più–
- Costruttore e distruttore in Java
- Distruttore in Java
- C # vs prestazioni Java
- Che cos'è JVM?