Condivisione della tecnologia

[Nozioni di base su JVM] Introduzione a Java Garbage Collector

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Garbage Collector (implementazione dell'algoritmo di Garbage Collection)

Il Garbage Collector è l'implementazione specifica dell'algoritmo di Garbage Collection . Poiché il garbage collector è diviso in giovane generazione e vecchia generazione, oltre a G1 (che può controllare sia la nuova generazione che la vecchia generazione),I garbage collector di nuova e vecchia generazione devono essere utilizzati in coppia in base ai requisiti dell'hotspot.(Devi scegliere la combinazione corrispondente in base alla versione JDK)

Il rapporto di combinazione specifico è il seguente:

Inserisci qui la descrizione dell'immagine

Nel codice sorgente sottostante della JVM, in alcuni casi speciali, il riciclatore CMS chiamerà il riciclatore Serial Old.

Arthas visualizza il garbage collector utilizzato

Non puoi vedere direttamente quale garbage collector viene utilizzato, puoi solo dedurlo in base all'algoritmo.

Inserisci qui la descrizione dell'immagine

Young Generation-Serial Garbage Collector

Il seriale è aRaccolta seriale a thread singolo di giovane generazioneIl netturbino.

Inserisci qui la descrizione dell'immagine

Ere del riciclo e algoritmi

  • giovane generazione
  • Algoritmo di replica

vantaggio

Eccellente throughput su un singolo processore CPU

discordanza

Il throughput con più CPU non è buono come quello di altri garbage collector (thread singolo, utilizzo di una sola CPU). Se l'heap è troppo grande, il thread dell'utente attenderà a lungo.

Scena applicabile

Programmi client scritti in Java o scenari con configurazione hardware limitata (non molti core CPU)

come usare

-XX: UseSerialGC: Sia la nuova generazione che la vecchia generazione utilizzano il raccoglitore seriale.

Vecchia generazione-SerialeVecchio garbage collector

SerialOld è la versione di vecchia generazione del Serial Garbage Collector, che utilizzaRaccolta seriale a thread singolo

Inserisci qui la descrizione dell'immagine

Ere del riciclo e algoritmi

  • vecchiaia
  • Algoritmo di confronto dei segni

vantaggio

Eccellente throughput su un singolo processore CPU

discordanza

Il throughput con più CPU non è buono come quello di altri garbage collector. Se l'heap è troppo grande, il thread utente attenderà a lungo.

Scena applicabile

Utilizzato con il Garbage Collector seriale o in casi speciali CMS

come usare

-XX: UseSerialGC: Sia la nuova generazione che la vecchia generazione utilizzano il raccoglitore seriale.

Giovane generazione-ParNew garbage collector

Il Garbage Collector ParNew è essenzialmenteOttimizzazione della seriale su più CPU, utilizzando il multithreading per la garbage collection

Inserisci qui la descrizione dell'immagine

Età e algoritmo di riciclaggio:

  • giovane generazione
  • Algoritmo di replica

vantaggio

  • Tempi di pausa più brevi con processori multi-CPU

discordanza

  • Il throughput e il tempo di pausa non sono buoni come G1, quindi non è consigliato dopo JDK9

Scena applicabile

  • In JDK8 e nelle versioni precedenti, viene utilizzato insieme al garbage collector CMS di vecchia generazione.

come usare

  • -XX: UseParNewGC: La nuova generazione utilizza il raccoglitore ParNew e la vecchia generazione utilizza il raccoglitore seriale.

Inserisci qui la descrizione dell'immagine

Garbage Collector CMS di vecchia generazione (Concurrent Mark Sweep).

Il garbage collector del CMS si concentra sul tempo di pausa del sistema (per ridurre al minimo il STW e ottimizzare l'esperienza dell'utente),Consentire l'esecuzione simultanea dei thread utente e dei thread di Garbage Collection in determinati passaggi, riducendo il tempo di attesa dei thread utente.

Ere del riciclo e algoritmi

  • vecchiaia
  • Algoritmo di marcatura e scansione

vantaggio

  • Il tempo di pausa del sistema dovuto alla garbage collection è più breve e l'esperienza dell'utente è migliore.

discordanza

1. Problema di frammentazione della memoria

2. Problema di degrado (in alcuni casi specifici, degenererà in un raccoglitore a thread singolo come SerialOld)

3. Problema dei rifiuti galleggianti (alcuni rifiuti non possono essere riciclati durante il processo di riciclaggio)

Scena applicabile

Scenari in sistemi Internet su larga scala in cui gli utenti richiedono grandi quantità di dati e alta frequenza, come interfacce di ordini, interfacce di prodotto, ecc.

utilizzo

XX: UseConcMarkSweepGC, è possibile impostare rispettivamente i collezionisti della giovane generazione e della vecchia generazione.

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

Fasi di esecuzione del CMS

  1. Marcatura iniziale, tracciatura in tempi brevissimiOggetti a cui GC Roots può relazionarsi direttamente
  2. marcatura simultanea, Segna tutti gli oggetti , non è necessario mettere in pausa il thread utente. (Sebbene la marcatura simultanea venga eseguita insieme al thread utente, se le risorse occupate dalla marcatura simultanea sono elevate, influenzerà anche il thread utente)
  3. Osservazione (concorrenza), poiché alcuni oggetti cambieranno durante la fase di marcatura simultanea, ci sarà un'etichettatura errata (l'oggetto utilizzato era originariamente vivo, ma dopo la marcatura, il thread utente lo ha reso non vitale, con conseguente etichettatura errata), etichettatura mancante ( Perché è simultaneo, alcuni oggetti potrebbero essere appena stati creati dal thread dell'utente, il che porterà a tag mancanti) e altre situazioni e devono essere contrassegnati nuovamente.
  4. Pulizia simultanea, pulizia di oggetti morti, non è necessario mettere in pausa i thread dell'utente.

Nota: STW apparirà solo durante le fasi di marcatura iniziale e rimarcatura.

Inserisci qui la descrizione dell'immagine

discordanza:

1. CMS utilizza un algoritmo mark-and-clear. Una volta completata la garbage collection, verrà visualizzato un gran numero di frammenti di memoria per non influenzare l'allocazione degli oggetti.Il CMS verrà deframmentato durante il GC completo. . Ciò farà sì che il thread dell'utente venga messo in pausa,È possibile utilizzare il parametro -XX:CMSFullGCsBeforeCompaction=N (valore predefinito 0) per regolare il numero completo di GC N volte prima di ordinarlo.

2. Impossibile gestire la "spazzatura mobile" generata durante il processo di pulizia simultaneo e non è possibile ottenere la raccolta dei rifiuti completa (durante questo processo di pulizia, il thread utente ha creato contemporaneamente alcuni oggetti, ma non sono stati riutilizzati presto. Questi oggetti non lo sono riciclato in questa pulizia e deve attendere fino alla pulizia successiva, quindi si chiama spazzatura galleggiante).

3. Se nella vecchia generazione non c'è memoria sufficiente per allocare gli oggetti, CMS degenererà in Serial Old a thread singolo riciclando la vecchia generazione.

Numero di thread simultanei:

È possibile passare il numero di thread durante l'esecuzione della fase simultanea in CMS-XX:ConcGCThreadsLe impostazioni dei parametri vengono calcolate dal sistema e la formula di calcolo è:(-XX:ParallelGCThreads定义的线程数 3) / 4, ParallelGCThreads è il numero di thread paralleli dopo la pausa STW

ParallelGCThreads è determinato dal numero di core del processore:

1. Quando il numero di core CPU è inferiore a 8, ParallelGCThreads = Numero di core CPU

2. Altrimenti ParallelGCThreads = 8 (Numero di core CPU – 8)*5/8

Sul mio computer sono presenti 12 processori logici, quindi ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: il numero di thread definiti da ParallelGCThreads 3) / 4 = (10 3) / 4 = 3

Inserisci qui la descrizione dell'immagine

Finalmente puoi ottenere questa immagine:

Inserisci qui la descrizione dell'immagine

Le fasi simultanee di marcatura e pulizia verranno elaborate in parallelo utilizzando tre thread. La fase di rimarcatura verrà elaborata utilizzando 10 thread. Poiché il numero di core della CPU è limitato, la fase simultanea influirà sulle prestazioni di esecuzione dei thread utente.

Inserisci qui la descrizione dell'immagine

Young Generation-Parallel Scavenge Garbage Collector

Lo scavenging parallelo lo èGarbage Collector di nuova generazione predefinito JDK8,MultithreadingRaccolta parallelaConcentrarsi sulla produttività del sistema .Al fine di aumentare la produttività, PS lo faràRegola automaticamente la dimensione della memoria heap (regola la dimensione della memoria di nuova generazione, quella di vecchia generazione, la soglia di promozione)

Inserisci qui la descrizione dell'immagine

Ere del riciclo e algoritmi

  • giovane generazione
  • Algoritmo di replica

vantaggio

  • La produttività è elevata e supporta l'impostazione manuale dei parametri per controllare la produttività. Per migliorare il throughput, la macchina virtuale regola dinamicamente i parametri dell'heap (l'utente deve solo impostare il throughput e non è necessario impostare altri parametri come la dimensione della memoria).

discordanza

  • Non è garantito un unico tempo di pausa, ma supporta l'impostazione del tempo STW.

Scena applicabile

  • Le attività in background non richiedono l'interazione dell'utente e tendono a generare un numero elevato di oggetti.Ad esempio: elaborazione di big data, esportazione di file di grandi dimensioni

Parametri comuni

Parallel Scavenge consente l'impostazione manuale dei tempi massimi di pausa e di throughput. I funzionari Oracle consigliano di non impostare la memoria heap massima quando si utilizza questa combinazione. Il garbage collector regolerà automaticamente la dimensione della memoria in base al tempo di pausa massimo e al throughput.

  • tempo massimo di pausa,-XX:MaxGCPauseMillis=n Imposta il numero massimo di millisecondi da mettere in pausa per ogni Garbage Collection
  • portata,-XX:GCTimeRatio=n Imposta il throughput su n (tempo di esecuzione del thread utente = n/(n 1))
  • Regola automaticamente la dimensione della memoria, -XX: UseAdaptiveSizePolicyL'impostazione consente al Garbage Collector di regolare automaticamente la dimensione della memoria in base al throughput e ai millisecondi di pausa massimi. Questo parametro è abilitato per impostazione predefinita (Oracle consiglia, quando si utilizza la combinazione PS, di non impostare la memoria heap massima e di lasciare che il Garbage Collector si adatti automaticamente).

Nota: i due indicatori del tempo di pausa massimo e del throughput sono in conflitto. Il Garbage Collector farà del suo meglio per rispettare il tempo di pausa massimo (a volte è impostato su un valore troppo piccolo e non può essere soddisfatto e il tempo di pausa massimo impostato verrà superato). , sacrificando la produttività.Se vuoi impostare il tempo massimo di pausa e la produttività allo stesso tempo, devi fare più test per renderli più coordinati.

Vecchia generazione in parallelo Vecchio raccoglitore di rifiuti

Parallel Old è una versione di vecchia generazione progettata per il raccoglitore Parallel Scavenge, che utilizza la raccolta simultanea multi-thread.

Inserisci qui la descrizione dell'immagine

Ere del riciclo e algoritmi

  • vecchiaia
  • Algoritmo Mark-and-sort (in realtà ordinamento mark-and-sweep)

vantaggio

  • La raccolta simultanea è più efficiente con CPU multi-core

discordanza

  • Il tempo di pausa sarà più lungo

Scena applicabile

  • Utilizzato con Scavenge parallelo

come usare

JDK8 imposta i parametri per utilizzare questo riciclatore per impostazione predefinita.

parametro:-XX: UseParallelGC O-XX: UseParallelOldGCPuoi utilizzare la combinazione Parallel Scavenge Parallel Old.
Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

test

-XX: PrintFlagsFinal: È possibile stampare i valori finali di tutti gli elementi di configurazione all'avvio del programma. È possibile verificare se la funzione di regolazione automatica è attivata.

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收器案例3
 */
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC  -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC   -Xmn8g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal  -XX:GCTimeRatio = 19  -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {

    public static void main(String[] args) throws IOException {
        int count = 0;
        List