what is garbage collection java
Questo tutorial spiega cos'è la Garbage Collection in Java e come funziona Garbage Collector. Imparerai anche gli algoritmi per la raccolta dei rifiuti:
I lettori che conoscono C / C ++ devono essere consapevoli che è responsabilità del programmatore creare ed eliminare gli oggetti in C / C ++.
Se il programmatore si dimentica di distruggere gli oggetti creati, sorgono gravi errori. Questo perché la mancata distruzione degli oggetti può causare ' Fuori dalla memoria 'Errori, perdite di memoria, ecc.
Questa situazione è completamente risolta in Java in quanto non è necessario che un programmatore tenga traccia degli oggetti. Java si occupa della distruzione degli oggetti per noi tramite la garbage collection automatica.
=> Visita qui per imparare Java da zero.
Il processo mediante il quale gli oggetti che non sono più in uso vengono rimossi dalla memoria heap è chiamato 'Garbage Collection'. La tecnica di garbage collection fa parte della gestione della memoria in Java.
Così in Java, il Garbage Collector distrugge tutti gli oggetti che non sono più in uso.
Cosa imparerai:
- Che cos'è un Garbage Collector in Java?
- Come funziona la raccolta dei rifiuti in Java?
- Algoritmi di raccolta dei rifiuti in Java
- Conclusione
Che cos'è un Garbage Collector in Java?
La Garbage Collection in Java è gestita da un programma chiamato Garbage Collector.
Garbage Collector può essere definito come un programma utilizzato per gestire automaticamente la memoria gestendo la disallocazione degli oggetti.
Sappiamo che in linguaggio Java, i nuovi oggetti vengono creati e allocata memoria utilizzando il nuovo operatore. La memoria allocata a un oggetto utilizzando un nuovo operatore rimane allocata finché i riferimenti non utilizzano questo oggetto.
Non appena i riferimenti cessano di esistere, la memoria che l'oggetto occupa viene recuperata. Java quindi gestisce automaticamente la de-allocazione o la distruzione degli oggetti e non è necessario distruggere esplicitamente l'oggetto.
Questa tecnica è la tecnica di Garbage Collection in Java in cui i programmatori non devono gestire esplicitamente la deallocazione degli oggetti.
Si noti che se i programmi non disallocano la memoria quando gli oggetti non ne hanno bisogno, alla fine non ci sarà più memoria da allocare ei programmi andranno in crash. Questa situazione è chiamata perdita di memoria.
Il garbage collector viene sempre eseguito in background su un thread daemon. Garbage Collector è considerato il miglior esempio del thread daemon.
Garbage Collector viene eseguito con l'intenzione di rilasciare la memoria heap. Lo fa distruggendo gli oggetti che sono 'irraggiungibili'.
Che cos'è un oggetto 'irraggiungibile'?
Un oggetto diventa irraggiungibile quando non c'è nemmeno un singolo riferimento ad esso associato.
Considera la seguente parte di codice:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Come si vede dal codice precedente, un oggetto è raggiungibile purché ad esso sia associato un riferimento. Nel momento in cui l'associazione di riferimento viene rimossa (un riferimento di impostazione a null nel caso precedente) l'oggetto diventa irraggiungibile.
Quando un oggetto diventa irraggiungibile, diventa idoneo per Garbage Collection (GC).
Come possiamo rendere un oggetto idoneo per GC?
Sebbene il programmatore non sia tenuto a distruggere gli oggetti poiché vengono gestiti da GC, almeno il programmatore può rendere questi oggetti irraggiungibili quando non sono più necessari.
In questo modo, GC raccoglierà gli oggetti irraggiungibili e li distruggerà.
Esistono alcuni modi per rendere un oggetto idoneo per GC rendendolo irraggiungibile.
Sono:
# 1) Annulla il riferimento
Dato un riferimento assegnato a un oggetto, se questo oggetto non è più necessario, assegnare il riferimento a null.
Student s = new Student (); s = null;
Quando s è impostato su null, l'oggetto Student diventa irraggiungibile.
# 2) Riassegna il riferimento
Questo è un altro modo per rendere gli oggetti idonei per GC.
Considera il codice seguente.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Ora, poiché abbiamo assegnato s1 a un altro oggetto, l'oggetto Student a cui fa riferimento s1 viene dereferenziato.
# 3) Crea un oggetto anonimo
Creando un oggetto anonimo possiamo rendere gli oggetti idonei per GC.
Possiamo creare un oggetto anonimo come mostrato di seguito:
new Student();
Una volta resi idonei gli oggetti per GC, questi possono o meno essere distrutti immediatamente da GC. Questo perché non possiamo forzare esplicitamente l'esecuzione del GC come e quando vogliamo.
Quando viene eseguito il Garbage Collector?
Spetta alla JVM eseguire il programma Garbage Collector. Quando JVM esegue Garbage Collector, gli oggetti non raggiungibili vengono eliminati. Tuttavia, non possiamo garantire quando verrà eseguita la JVM.
Sebbene non possiamo forzare l'esecuzione del GC, possiamo benissimo richiedere una Garbage Collection.
Il GC può essere richiesto utilizzando uno dei seguenti metodi.
# 1) System.gc (): La classe System di Java fornisce un metodo statico gc () utilizzando il quale possiamo richiedere alla JVM di eseguire Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Come System.gc (), possiamo anche utilizzare il metodo gc () della 'classe Runtime' per richiedere a JVM di eseguire Garbage Collector.
Nota: Non esiste alcuna garanzia che Garbage Collector venga eseguito dopo una richiesta da questi due metodi.
Finalizzazione
La finalizzazione viene eseguita da Garbage Collector appena prima di distruggere gli oggetti. Come parte della tecnica di finalizzazione, Garbage Collector chiama il metodo finalize () sull'oggetto. Il metodo finalize () viene utilizzato per eseguire attività di pulizia.
Il metodo finalize () è fornito dalla classe 'Object' e ha il seguente prototipo.
protected void finalize () throws Throwable
Il metodo finalize () viene invocato ogni volta che l'oggetto viene sottoposto a garbage collection
Nota: Il Garbage Collector raccoglie solo gli oggetti creati utilizzando la nuova parola chiave. Per altri oggetti, dobbiamo usare il metodo finalize () per eseguire la pulizia.
Il programma seguente mostra una semplice Garbage Collection in Java.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args[]){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Produzione
Nel programma sopra, abbiamo creato una classe TestGC. In questa classe, abbiamo sovrascritto il metodo finalize (). Quindi nella classe principale, creiamo due oggetti della classe TestGC. Per prima cosa, annulliamo un oggetto e chiamiamo System.gc () per richiedere Garbage Collector.
Successivamente, annulliamo il secondo oggetto e chiamiamo il metodo Runtime.getRuntime.gc () per richiedere Garbage Collector. L'output mostra due volte l'output del metodo finalize, indicando così che Garbage Collector è stato eseguito due volte.
Nota: Anche se abbiamo questo output, non è garantito che ogni volta otterremo lo stesso output. Dipende completamente da JVM.
Come funziona la raccolta dei rifiuti in Java?
In questa sezione vedremo come funziona Garbage Collection in Java.
Durante la garbage collection, il Garbage Collector cerca la memoria Heap e quindi 'contrassegna' gli oggetti non raggiungibili. Quindi li distrugge.
Ma il problema sorge quando il numero di oggetti aumenta. Man mano che gli oggetti aumentano, aumenta anche il tempo impiegato per Garbage Collection mentre cerca oggetti irraggiungibili. Tuttavia, non influisce troppo poiché la maggior parte degli oggetti ha una breve durata.
Viene chiamato il comportamento sopra 'Raccolta generazionale dei rifiuti' e dovrebbe migliorare le prestazioni di JVM. In questo approccio, l'intero spazio Heap è suddiviso in: Young Generation, Old or Tenured Generation e Permanent Generation.
# 1) Spazio Heap di Young Generation: Tutti i nuovi oggetti vengono creati in questo spazio. Una volta che lo spazio è pieno, si svolge Minor GC in cui tutti gli oggetti morti vengono distrutti. Il processo GC minore è veloce e veloce poiché la maggior parte degli oggetti è morta. Gli oggetti sopravvissuti alla giovane generazione vengono spostati alle generazioni precedenti.
# 2) Spazio heap di vecchia generazione: Questa generazione immagazzina oggetti che sopravvivono a lungo. Quando viene raggiunta l'età soglia fissata per la giovane generazione, l'oggetto viene spostato nella vecchia generazione. Quando lo spazio della vecchia generazione è riempito, viene eseguito un Major GC.
Il GC principale è lento poiché gli oggetti coinvolti qui sono oggetti attivi. A volte l'intero spazio Heap che include i giovani e le vecchie generazioni viene cancellato. Questo è chiamato 'Full GC'.
# 3) Generazione permanenteL Fino a Java 7 c'era una generazione permanente (Perm Gen). I metadati detenuti da Perm Gen sono stati utilizzati da JVM. JVM ha utilizzato questi metadati per descrivere classi e metodi utilizzati nell'applicazione. Perm Gen è stato rimosso in Java 8.
Garbage Collection Java 8: Perm Gen e Metaspace
Abbiamo già accennato allo spazio Perm Gen che era presente fino a Java 7. Tuttavia, ora in Java 8, la JVM rappresenta i metadati della classe utilizzando la memoria nativa chiamata 'Metaspace'.
Oltre a Metaspace, c'è un nuovo flag chiamato 'MaxMetaspaceSize' che limita la memoria utilizzata per i metadati della classe. Se non viene specificato alcun valore per MaxMetaspaceSize, Metaspace lo ridimensiona in fase di esecuzione in base alla richiesta dell'applicazione.
Quando lo spazio dei metadati della classe raggiunge MaxMetaspaceSize, viene attivato il Metaspace GC. Quando c'è un eccesso di Metaspace GC, indica una perdita di memoria di classi, classloader, ecc. Oltre a un dimensionamento inadeguato.
Algoritmi di raccolta dei rifiuti in Java
Esistono vari modi in cui viene eseguita la Garbage Collection. In questa sezione, presenteremo quattro di questi modi o algoritmi per Garbage Collection in Java.
GC seriale
Serial GC è l'algoritmo GC più semplice. Funziona principalmente su heap di piccole dimensioni e sistemi a thread singolo. Durante il lavoro, Serial GC blocca tutte le applicazioni.
Per attivare Serial GC, possiamo utilizzare la seguente opzione JVM.
migliori app spia per telefoni Android
java –xx:+UseSerialGC –jar Application.java
Il comando precedente può essere fornito nella riga di comando. Qui Application.java è un file per il quale deve essere abilitato il GC seriale.
Throughput / GC parallelo
L'algoritmo GC parallelo è quello predefinito in JDK 8. Questo algoritmo utilizza più thread per eseguire la scansione dello spazio dell'heap e della compattazione. Questo algoritmo è adatto principalmente per applicazioni in grado di gestire le pause dei thread e ottimizzare il sovraccarico della CPU.
Uno svantaggio del GC parallelo è che durante l'esecuzione di GC minore o completo, l'algoritmo sospende i thread dell'applicazione.
Il CMS Collector
Il CMS sta per ' Mark Sweep simultaneo '. Questo algoritmo fa uso di multiple concorrente thread per eseguire la scansione dell'heap ( marchio ) per identificare gli oggetti inutilizzati e riciclare ( spazzare ) loro. Il raccoglitore CMS ha una modalità Stop-The-World (STW).
Il raccoglitore entra in questa modalità in due scenari:
- Quando oggetti appartenenti alla vecchia generazione possono essere raggiunti da variabili statiche o punti di ingresso di thread. Quindi questa modalità è attiva durante l'inizializzazione dei segni di radice iniziali.
- Quando l'algoritmo è in esecuzione contemporaneamente, l'applicazione cambia lo stato e forza il collector a tornare indietro per assicurarsi che gli oggetti corretti siano contrassegnati.
Il raccoglitore CMS, tuttavia, potrebbe soffrire di 'errori di promozione'. Allora, cos'è un fallimento promozionale? Se gli oggetti dallo spazio della giovane generazione vengono spostati nella vecchia generazione e il collezionista non ha creato abbastanza spazio per questi oggetti nello spazio dell'heap della vecchia generazione, si verificherà un fallimento promozionale.
Per evitare errori promozionali, possiamo fornire più thread in background al raccoglitore o fornire più dimensioni dell'heap alla vecchia generazione.
Il collezionista G1
Il G1 Collector è il 'Garbage-First' Collector. È progettato per heap di dimensioni superiori a 4 GB. In base alla dimensione dell'heap, divide la dimensione dell'heap in regioni di dimensioni comprese tra 1 MB e 32 MB.
Il collettore G1 contrassegna gli oggetti a seconda della vivacità degli oggetti in tutto il mucchio. Dopo questa fase di marcatura, G1 è a conoscenza delle regioni vuote. Così raccoglie gli oggetti irraggiungibili da queste regioni liberando così una grande quantità di spazio. Quindi è chiamato Garbage-First poiché raccoglie prima le regioni che contengono spazzatura.
Inoltre soddisfa l'obiettivo del tempo di pausa definito dall'utente utilizzando un modello di previsione della pausa selezionando il numero di regioni da raccogliere in base all'obiettivo del tempo di pausa specificato.
Vantaggio della raccolta dei rifiuti
- Garbage Collection rende efficiente la gestione della memoria in Java poiché rimuove gli oggetti non referenziati dalla memoria dell'heap senza l'interferenza del programmatore.
- Poiché la Garbage Collection è automatica e fa parte di JVM, non sono necessari ulteriori sforzi da parte del programmatore per recuperare memoria o distruggere oggetti.
- Il programmatore non ha bisogno di scrivere alcun codice specifico per de-allocare la memoria ed eliminare gli oggetti come fatto in C / C ++.
Domande frequenti
D # 1) Qual è il ruolo di un Garbage Collector?
Risposta: In Java, il Garbage Collector è la parte principale nella gestione della memoria e ha il compito di raccogliere gli oggetti non raggiungibili e recuperare la memoria.
D # 2) Cosa intendi per Garbage Collection?
Risposta: La garbage collection è la tecnica con cui la memoria viene gestita automaticamente recuperando la memoria inutilizzata. È una caratteristica presente nei linguaggi di programmazione come Java, per cui i programmatori non devono tenere traccia degli oggetti inutilizzati e distruggerli. Viene eseguito automaticamente utilizzando Garbage Collection.
Q # 3) Chi è responsabile della Garbage Collection in Java?
Risposta: La gestione della memoria di Java ha la responsabilità della Garbage Collection.
Q # 4) Come possiamo prevenire la Garbage Collection in Java?
Risposta: Poiché Garbage Collector non recupera la memoria di variabili / oggetti attivi, il modo migliore per impedire Garbage Collection è continuare a utilizzare variabili / oggetti in tutto il programma.
Q # 5) Come puoi assicurarti che un oggetto venga raccolto tramite Garbage Collection?
Risposta: Un oggetto è idoneo per la Garbage Collection quando non è raggiungibile, ovvero quando non ci sono più riferimenti che fanno riferimento all'oggetto. Sebbene non possiamo forzare l'esecuzione di Garbage Collector ogni volta che vogliamo, possiamo sempre richiederne l'esecuzione utilizzando System.gc ().
Conclusione
La Garbage Collection in Java di cui abbiamo discusso in questo tutorial è automatica e il programmatore non deve preoccuparsi di eliminare gli oggetti o le variabili allocate nel programma.
La raccolta automatica dei rifiuti in Java è la caratteristica più importante del linguaggio e fa parte della gestione della memoria in Java.
Sebbene Garbage Collection venga eseguita da JVM ed è fuori dalla portata del programmatore, possiamo sempre richiedere che Garbage Collector venga eseguito utilizzando il metodo gc () della classe System e Runtime.
In questo tutorial, abbiamo discusso il processo di finalizzazione che viene eseguito prima che gli oggetti vengano distrutti da Garbage Collector. Abbiamo anche discusso il processo di Garbage Collection in Java. Infine, abbiamo discusso i vari algoritmi utilizzati dal Garbage Collector.
Questo completa la nostra discussione su Garbage Collector in Java.
=> Guarda qui la serie di formazione su Java semplice.
Lettura consigliata
- Nozioni di base su Java: sintassi Java, classe Java e concetti principali di Java
- Per cosa viene utilizzato Java: 12 applicazioni Java del mondo reale
- Tutorial Java String | Metodi Java String con esempi
- Tutorial JAVA per principianti: oltre 100 tutorial video Java pratici
- Componenti Java: piattaforma Java, JDK, JRE e Java Virtual Machine
- Distribuzione Java: creazione ed esecuzione di file JAR Java
- Java Virtual Machine: come JVM aiuta nell'esecuzione di applicazioni Java
- Tutorial Java Reflection con esempi