CodeGym/Java Course/Modulo 3/La raccolta generazionale dei rifiuti

La raccolta generazionale dei rifiuti

Disponibile

Lavorare con generazioni di oggetti

I garbage collector Java implementano una strategia di raccolta dei rifiuti generazionale che può classificare gli oggetti in base all'età.

Tale necessità (per contrassegnare e compattare tutti gli oggetti) nella JVM può essere definita inefficiente. Poiché quando viene allocato un numero elevato di oggetti, il loro elenco cresce, il che porta a un aumento del tempo di raccolta dei rifiuti. L'analisi empirica delle applicazioni ha dimostrato che la maggior parte degli oggetti in Java ha vita breve.

L'area di memoria heap nella JVM è divisa in tre sezioni:

Lavorare con generazioni di oggetti

Nuove generazioni

Gli oggetti di nuova creazione iniziano nella generazione più giovane. La generazione più giovane è ulteriormente suddivisa in due categorie.

  • Eden Space - Tutti i nuovi oggetti iniziano qui, a loro viene assegnata la memoria iniziale.
  • Survivor Spaces (FromSpace e ToSpace) - Gli oggetti vengono spostati qui da Eden dopo essere sopravvissuti a un ciclo di raccolta dei rifiuti.

Il processo in cui gli oggetti vengono sottoposti a Garbage Collection dalla generazione più giovane è chiamato evento di Garbage Collection minore.

Quando lo spazio di Eden è pieno di oggetti, viene eseguita una piccola raccolta dei rifiuti. Tutti gli oggetti morti vengono rimossi e tutti quelli vivi vengono spostati in uno dei due spazi rimanenti. Il piccolo GC controlla anche gli oggetti nello spazio dei sopravvissuti e li sposta in un altro (successivo) spazio dei sopravvissuti.

Prendiamo come esempio la seguente sequenza.

  1. Ci sono oggetti di entrambi i tipi (vivi e morti) nell'Eden.
  2. Si verifica un piccolo GC: tutti gli oggetti morti vengono rimossi dall'Eden. Tutti gli oggetti viventi vengono spostati nello spazio-1 (FromSpace). L'Eden e lo spazio-2 ora sono vuoti.
  3. Nuovi oggetti vengono creati e aggiunti a Eden. Alcuni oggetti nell'Eden e nello spazio-1 diventano morti.
  4. Si verifica un piccolo GC: tutti gli oggetti morti vengono rimossi dall'Eden e dallo spazio-1. Tutti gli oggetti viventi vengono spostati nello spazio-2 (ToSpace). Eden e spazio-1 sono vuoti.

Pertanto, in qualsiasi momento, uno degli spazi dei sopravvissuti è sempre vuoto. Quando i sopravvissuti raggiungono una certa soglia per muoversi attraverso gli spazi dei sopravvissuti, avanzano a una generazione più anziana.

È possibile utilizzare il flag -Xmn per impostare la dimensione della giovane generazione .

Vecchia generazione

Gli oggetti che vivono una quantità significativa di tempo (ad esempio, la maggior parte della vita di un programma) alla fine diventano oggetti più vecchi - centenari. È anche conosciuta come la generazione normale e contiene oggetti che sono stati lasciati negli spazi dei sopravvissuti per molto tempo.

La soglia di durata di un oggetto determina il numero di cicli di Garbage Collection che deve superare prima che venga spostato alla generazione precedente. Il processo in cui gli oggetti vengono inviati alla spazzatura dalla generazione precedente è chiamato evento di raccolta dei rifiuti principale.

È possibile utilizzare i flag -Xms e -Xmx per impostare la dimensione iniziale e massima della memoria heap .

Poiché Java utilizza la raccolta dei rifiuti generazionale, più eventi di raccolta dei rifiuti sperimenta un oggetto, più si sposta nell'heap. Inizia nella generazione più giovane e alla fine finisce nella generazione normale se vive abbastanza a lungo.

Per comprendere la promozione degli oggetti tra spazi e generazioni, si consideri il seguente esempio:

Quando un oggetto viene creato, viene prima collocato nello spazio dell'Eden della giovane generazione.

Non appena si verifica una piccola raccolta di rifiuti, gli oggetti viventi di Eden vengono spostati su FromSpace. Quando si verifica la successiva Garbage Collection minore, gli oggetti viventi sia di Eden che dello spazio vengono spostati in ToSpace.

Questo ciclo continua un certo numero di volte. Se l'oggetto è ancora "in servizio" dopo questo punto, il successivo ciclo di Garbage Collection lo sposterà nello spazio di generazione precedente.

Generazione permanente e metaspazio

Metadati come classi e metodi sono archiviati nella generazione persistente. La JVM lo popola in fase di esecuzione in base alle classi utilizzate dall'applicazione. Le classi che non vengono più utilizzate possono passare dalla generazione permanente alla spazzatura.

È possibile utilizzare i flag -XX:PermGen e -XX:MaxPermGen per impostare la dimensione iniziale e massima del permanent generation .

metaspazio

Da Java 8, lo spazio PermGen è stato sostituito dallo spazio di memoria MetaSpace. L'implementazione differisce da PermGen: questo spazio heap viene ora modificato automaticamente.

In questo modo si evita il problema di memoria insufficiente dell'applicazione che si verifica a causa delle dimensioni limitate dello spazio heap di PermGen. La memoria del metaspazio può essere sottoposta a Garbage Collection e le classi che non sono più in uso verranno automaticamente ripulite quando il metaspazio raggiunge la sua dimensione massima.

Commenti
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti