CodeGym/Java Course/Modulo 3/Tipi di Garbage Collector in Java

Tipi di Garbage Collector in Java

Disponibile

GC seriale

La Garbage Collection migliora l'efficienza della memoria in Java rimuovendo gli oggetti senza riferimenti dall'heap e liberando spazio per gli oggetti appena creati.

La macchina virtuale Java ha otto tipi di Garbage Collector. Consideriamo ciascuno di essi in dettaglio.

Serial GC è l'implementazione GC più semplice. È destinato a piccole applicazioni in esecuzione in ambienti a thread singolo. Tutti gli eventi di Garbage Collection vengono eseguiti in sequenza sullo stesso thread. La compattazione viene eseguita dopo ogni Garbage Collection.

GC seriale

L'esecuzione del programma di raccolta risulta in un evento "world stop", in cui l'intera applicazione viene sospesa. Poiché l'intera applicazione viene bloccata durante la raccolta dei rifiuti, non dovresti ricorrere a questo nella vita reale se desideri mantenere i ritardi il più bassi possibile.

L'argomento JVM per utilizzare il Garbage Collector seriale è -XX:+UseSerialGC .

GC parallelo

Il Garbage Collector parallelo è progettato per applicazioni con set di dati medio-grandi eseguiti su hardware multithread o multiprocessore. Questa è l'implementazione GC predefinita ed è anche nota come raccoglitore di throughput.

Diversi thread sono destinati alla piccola raccolta dei rifiuti nelle giovani generazioni. L'unico thread è impegnato con la raccolta dei rifiuti principale nella vecchia generazione.

GC parallelo

L'esecuzione di un GC parallelo fa sì che il mondo si "fermi" e l'applicazione si blocchi. Questo comportamento è più appropriato per un ambiente multithread in cui è necessario completare molte attività e sono accettabili lunghe pause, ad esempio durante l'esecuzione di un processo batch.

L'argomento JVM per utilizzare il Garbage Collector parallelo è -XX:+UseParallelGC .

CMS GC

Conosciuto anche da noi come raccoglitore parallelo a riposo basso .

Qui, per una piccola raccolta di rifiuti, sono coinvolti diversi thread, ciò avviene tramite lo stesso algoritmo del raccoglitore parallelo. La raccolta dei rifiuti principale è multi-thread, proprio come il vecchio GC parallelo, ma il CMS viene eseguito contemporaneamente ai processi dell'applicazione per ridurre al minimo gli eventi "world stop".

CMS GC

Per questo motivo, il programma di raccolta CMS consuma più CPU rispetto ad altri programmi di raccolta. Se hai la possibilità di allocare più CPU per migliorare le prestazioni, allora un CMS è preferibile a un semplice collettore parallelo. Il CMS GC non compatta.

L'argomento JVM per utilizzare il Garbage Collector Mark-Sweep parallelo è -XX:+UseConcMarkSweepGC .

G1 (Garbage first) GC

G1GC è stato concepito come sostituto di CMS ed è stato sviluppato per applicazioni multi-thread caratterizzate da heap di grandi dimensioni (superiori a 4 GB). È parallelo e competitivo come un CMS, ma sotto il cofano funziona in modo molto diverso rispetto ai vecchi netturbini.

Sebbene G1 operi anche su base generazionale, non dispone di spazi separati per le generazioni più giovani e più anziane. Al contrario, ogni generazione è un insieme di regioni, che consente flessibilità nel modificare le dimensioni della generazione più giovane.

G1 suddivide l'heap in un insieme di regioni di uguali dimensioni (a seconda delle dimensioni dell'heap) e le scansiona in più thread. L'area durante l'esecuzione del programma può diventare ripetutamente sia vecchia che giovane.

Al termine della fase di markup, G1 sa quali aree contengono più spazzatura. Se l'utente è interessato a ridurre al minimo le pause, G1 può selezionare solo alcune aree. Se il tempo di pausa non è importante per l'utente, o se il limite del tempo di pausa è impostato su alto, G1 sorvolerà più aree.

Poiché il GC G1 identifica le regioni con la maggior quantità di rifiuti ed esegue prima la raccolta dei rifiuti su tali regioni, viene chiamato "Garbage First".

Oltre alle aree di Eden, Sopravvissuti e Vecchia Memoria, ci sono altri due tipi in G1GC.

  • Humongous (Enorme) - per oggetti di grandi dimensioni (oltre il 50% della dimensione dell'heap).
  • Disponibile : spazio inutilizzato o non allocato.

L'argomento JVM per utilizzare il Garbage Collector G1 è -XX:+UseG1GC .

Shenandoah (Shandara)

Shenandoah è un nuovo GC rilasciato come parte di JDK 12. Il vantaggio principale di Shenandoah rispetto a G1 è che la maggior parte del ciclo di garbage collection viene eseguita contemporaneamente ai thread dell'applicazione. G1 può evacuare le aree heap solo quando l'applicazione è sospesa, mentre Shenandoah sposta gli oggetti contemporaneamente all'applicazione.

Shenandoah può compattare oggetti live, ripulire la spazzatura e liberare RAM quasi non appena viene trovata memoria libera. Poiché tutto ciò avviene contemporaneamente, senza sospendere l'applicazione, Shenandoah consuma più CPU.

Argomento JVM per il Garbage Collector di Shenandoah: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC .

ZGC

ZGC è un altro GC rilasciato come parte di JDK 11 e migliorato in JDK 12.

È destinato ad applicazioni che richiedono velocità e bassa latenza (pause inferiori a 10 ms) e/o utilizzano un heap molto grande (diversi terabyte).

Gli obiettivi principali di ZGC sono bassa latenza, scalabilità e facilità d'uso. Per fare ciò, consente all'applicazione Java di continuare a funzionare nonostante siano in corso operazioni di Garbage Collection. Per impostazione predefinita, ZGC rilascia la memoria inutilizzata e la restituisce al sistema operativo.

Pertanto, lo ZGC apporta un miglioramento significativo rispetto ad altri GC tradizionali fornendo tempi morti estremamente bassi (in genere entro 2 ms).

Principali obiettivi della ZGC 

L'argomento JVM per utilizzare il Garbage Collector ZGC è -XX:+UnlockExperimentalVMOptions -XX:+UseZGC .

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