2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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:
Nel codice sorgente sottostante della JVM, in alcuni casi speciali, il riciclatore CMS chiamerà il riciclatore Serial Old.
Non puoi vedere direttamente quale garbage collector viene utilizzato, puoi solo dedurlo in base all'algoritmo.
Il seriale è aRaccolta seriale a thread singolo di giovane generazioneIl netturbino.
Eccellente throughput su un singolo processore CPU
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.
Programmi client scritti in Java o scenari con configurazione hardware limitata (non molti core CPU)
-XX: UseSerialGC
: Sia la nuova generazione che la vecchia generazione utilizzano il raccoglitore seriale.
SerialOld è la versione di vecchia generazione del Serial Garbage Collector, che utilizzaRaccolta seriale a thread singolo
Eccellente throughput su un singolo processore CPU
Il throughput con più CPU non è buono come quello di altri garbage collector. Se l'heap è troppo grande, il thread utente attenderà a lungo.
Utilizzato con il Garbage Collector seriale o in casi speciali CMS
-XX: UseSerialGC
: Sia la nuova generazione che la vecchia generazione utilizzano il raccoglitore seriale.
Il Garbage Collector ParNew è essenzialmenteOttimizzazione della seriale su più CPU, utilizzando il multithreading per la garbage collection
-XX: UseParNewGC
: La nuova generazione utilizza il raccoglitore ParNew e la vecchia generazione utilizza il raccoglitore seriale.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.
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)
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.
XX: UseConcMarkSweepGC
, è possibile impostare rispettivamente i collezionisti della giovane generazione e della vecchia generazione.
Nota: STW apparirà solo durante le fasi di marcatura iniziale e rimarcatura.
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:ConcGCThreads
Le 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
Finalmente puoi ottenere questa 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.
Lo scavenging parallelo lo èGarbage Collector di nuova generazione predefinito JDK8,MultithreadingRaccolta parallela,Concentrarsi 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)。
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.
-XX:MaxGCPauseMillis=n
Imposta il numero massimo di millisecondi da mettere in pausa per ogni Garbage Collection-XX:GCTimeRatio=n
Imposta il throughput su n (tempo di esecuzione del thread utente = n/(n 1))-XX: UseAdaptiveSizePolicy
L'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.
Parallel Old è una versione di vecchia generazione progettata per il raccoglitore Parallel Scavenge, che utilizza la raccolta simultanea multi-thread.
JDK8 imposta i parametri per utilizzare questo riciclatore per impostazione predefinita.
parametro:-XX: UseParallelGC
O-XX: UseParallelOldGC
Puoi utilizzare la combinazione Parallel Scavenge Parallel Old.
-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.
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