Condivisione della tecnologia

[Algoritmo e raccoglitore di garbage collection GC]

2024-07-11

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

Autore: ofLJli
Collegamento: https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
Fonte: pepite di terre rare
Il copyright appartiene all'autore. Per la ristampa commerciale contattare l'autore per l'autorizzazione. Per la ristampa non commerciale indicare la fonte.


Panoramica

Le strutture principali nella JVM sono: stack della macchina virtuale, heap e area del metodo. La dimensione dello stack frame dello stack della macchina virtuale è stata determinata dal compilatore. Con la fine del metodo o della tecnologia thread viene riciclata anche la memoria dello stack della macchina virtuale. L'heap Java e l'area del metodo presentano incertezze significative. L'allocazione e il riciclaggio di questa parte della memoria sono dinamici. Ciò che interessa al GC è come gestire questa parte della memoria.

Questo articolo si concentra sui tre aspetti seguenti che GC deve realizzare:

  • Quando riciclare? (Condizioni che attivano GC)
  • Algoritmo di raccolta dei rifiuti
  • Netturbino

Quando riciclare

Secondo due ipotesi generazionali:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收 . L'heap è diviso in generazioni: la nuova generazione (Eden, From, To), la vecchia generazione e il riciclo generazionale viene eseguito anche durante GC.

immagine.png

Minore GC : Ricicla gli oggetti inutilizzati nella nuova generazione La caratteristica della maggior parte degli oggetti della nuova generazione è che vivono e muoiono dall'oggi al domani. I tempi di attivazione sono:

  • Lo spazio insufficiente nell'area dell'Eden attiva il GC Minore Poiché lo spazio dell'Eden è di dimensioni limitate, il GC Minore viene attivato più frequentemente. Ciò richiede un algoritmo di raccolta veloce ed efficiente, che viene generalmente utilizzato.标记-复制算法Riciclare quest'area (discusso più avanti).

Maggiore GC : Ricicla gli oggetti inutilizzati della vecchia generazione.uso generale标记-清除算法O标记-整理算法Riciclare.

GC completo : ricicla gli oggetti inutilizzati nell'heap e nell'area del metodo. L'intervallo di riciclo del GC completo è relativamente ampio e tempi di esecuzione lunghi possono causare ritardi, pertanto il numero di GC completo dovrebbe essere ridotto il più possibile. Gli orari di attivazione sono più o meno i seguenti:

  • Lo spazio insufficiente nella vecchia generazione è causato da oggetti di nuova generazione che entrano nella vecchia generazione, oggetti di grandi dimensioni che entrano direttamente nella vecchia generazione, ecc. Se questi oggetti non possono essere conservati nello spazio continuo massimo della vecchia generazione, verrà eseguito un riciclo completo GC .

  • Spazio insufficiente nell'area del metodo L'area del metodo memorizza principalmente informazioni sul tipo e pool costanti. Esiste anche il rischio di spazio insufficiente e verrà eseguito il riciclo completo del GC.

  • System.gc() viene chiamato esplicitamente e verrà riciclato da Full GC.

Tre algoritmi di garbage collection:

1. Algoritmo Mark-and-Sweep

Principio: utilizzare可达性分析算法Rendere gli oggetti non disponibilisegno, quindi eseguire l'operazioneChiaro . Svantaggi: l'efficienza della marcatura è bassa quando sono presenti molti oggetti. Dopo aver cancellato l'oggetto, si verificherà la frammentazione della memoria e la memoria sarà discontinua. Scopo: alcuni collezionisti utilizzeranno questo algoritmo nella raccolta di vecchia generazione

2. Algoritmo di contrassegno-copia

Principio: dividere lo spazio di memoria in due, metà viene utilizzata per l'archiviazione di oggetti e l'altra metà è libera.Se l'area in cui sono conservati gli oggetti è piena, utilizzare可达性分析算法Spostare oggetti viventisegnovieni fuori e poicopia Vai in un'altra area vuota e cancella tutte le aree precedenti in spazi vuoti continui. Svantaggio: se sono presenti molti oggetti sopravvissuti, sarà necessaria una grande quantità di copia e sviluppo della memoria. Lo spazio di memoria può utilizzare solo la metà dei vantaggi e sprecare risorse. Funzione: questo algoritmo di riciclaggio viene generalmente utilizzato per oggetti che vivono e muoiono nella nuova generazione. Tuttavia, l'algoritmo di replica è stato ottimizzato nella nuova generazione, ma questo algoritmo aggiunge un meccanismo di garanzia dell'allocazione per evitare che vengano allocati troppi oggetti sopravvissuti. Viene utilizzato un algoritmo di riciclaggio in stile Appel:

immagine.png

3. Algoritmo di marcatura-collazione

Principio: segue il processo di marcatura标记-清除算法Lo stesso, allora整理存Gli oggetti attivi si spostano verso un'estremità, quindi tutti gli oggetti all'esterno del confine attivo清除 . Svantaggi: Lo spostamento degli oggetti comporta alcuni rischi. Troppi oggetti sono inefficienti. Funzione: soprattutto nella vecchiaia.

immagine.png

Netturbino

Il garbage collector utilizzato da GC viene utilizzato per il riciclaggio. Con il continuo sviluppo, ci sono sempre più garbage collector. Ecco i garbage collector convenzionali e sono divisi in tre categorie: collector a thread singolo, collector multi-thread e simultaneo. dispositivo di raccolta.

Collettore a thread singolo

Le combinazioni di collector a thread singolo sono: Serial/Serial Old collector. Non solo utilizzano un thread di raccolta per completare l'operazione di raccolta, ma mentre il thread di raccolta funziona, il thread utente deve smettere di attendere fino al completamento della raccolta. L'immagine mostra lo schema del collettore Serial/Serial Old:

immagine.png Se le risorse di memoria del client sono limitate, il numero di core del processore è piccolo o si tratta di un processore single-core, la sua semplicità ed efficienza possono far sì che il raccoglitore completi il ​​suo lavoro il più rapidamente possibile.

Collettore parallelo multi-thread

I raccoglitori multi-thread includono: ParNew, Parallel Scavenge e Parallel Old, tra cui Parallel Scavenge/Parallel Old è un raccoglitore combinato. Questi raccoglitori multi-thread aggiungono solo thread di Garbage Collection e i thread utente smettono comunque di attendere la Garbage Collection.

immagine.png

parNew collector: in realtà è una versione multi-thread di Serial. Attualmente può cooperare con il collector Serial e il collector CMS.

Raccoglitore Parallel Scavenge: generalmente utilizzato insieme al raccoglitore Parallel Old.Rispetto al parNew collector, presta maggiore attenzione吞吐量controllo, il throughput èIl tempo di esecuzione del thread utente rappresenta il tempo di esecuzione totale della CPU, il throughput è ovviamente maggiore è, meglio è.

Il multi-threading generalmente utilizza il server, perché l'esecuzione del multi-threading comporta il tempo di consumo della rotazione degli intervalli di tempo. Se si tratta di un singolo processore, l'efficienza dell'elaborazione sarà senza dubbio più lenta. Ma è molto utile per le risorse e il lato server dei calcoli di analisi che non necessita di interagire con l'utente può aumentare l'efficienza di esecuzione.

collezionista contemporaneo

I raccoglitori simultanei includono: Raccoglitore CMS, che è un raccoglitore che mira a mantenere il tempo di pausa del sistema il più breve possibile e fornire una migliore esperienza utente. Il relativo thread di raccolta può essere eseguito contemporaneamente al thread dell'utente. CMS ne ha tre标记(voto iniziale, voto simultaneo, commento) e una volta清理(Pulizia simultanea), due dei tre contrassegni richiedono l'arresto del thread utente più corto, un contrassegno più lungo che è simultaneo con il thread utente e la cancellazione che è simultanea con il thread utente.

immagine.png

contrassegno iniziale: Segna il primo oggetto associato a GC Roots, il tempo è molto breve marcatura contemporanea: esegue la catena di riferimento di GC Roots (algoritmo di analisi di raggiungibilità) contemporaneamente al thread utente, cosa che richiede molto tempo rietichettare : Ricerca la nuova catena di riferimento generata dal thread utente durante la fase di marcatura simultanea. Un po' più lungo del segno iniziale.Concorrente chiaro:utilizzo标记-清除算法Elimina gli oggetti inutili.

Tre svantaggi principali: 1: sensibilità della CPU, la concorrenza può influire sul funzionamento dei thread utente su processori con un numero ridotto di core. 2: Garbage mobile: il garbage generato durante la fase di pulizia simultanea può attendere solo la successiva raccolta GC. Tre: frammentazione della memoria, pulizia dei segni I prodotti Puja hanno una grande quantità di spazio di memoria discontinuo.

riepilogo

Questo articolo inizia da那些内存需要回收什么时候回收如何回收Come implementazione, vengono scritti due algoritmi di giudizio sulla sopravvivenza degli oggetti, le condizioni per il riciclaggio dell'area di classe, il meccanismo generazionale e i tempi di raccolta del riciclaggio, tre algoritmi di raccolta e i garbage collector comunemente utilizzati.