Il mio primo blog risponde alla tua domanda: Generations of Garbage Allocation
Aggiungendo le informazioni su link:
Garbage collector del CLR (GC) è un garbage collector generazionale, noto anche come collezionista ephermal spazzatura.
Ha tre generazioni:
Generation 0: contiene tutti gli oggetti di nuova costruzione che non vengono mai esaminati mediante GC.
Generation 1: CLR, quando inizializza, seleziona una taglia bilancio kb per la generazione 0. Se la creazione di un oggetto fa sì che la generazione 0 superi il suo budget, viene avviata la raccolta dei dati inutili. Gli oggetti che non sono raccolti nella Generazione 0 vengono spostati nella Generazione 1 e la Generazione 0 viene svuotata. Diciamo che il budget della Generazione 0 è uguale alla dimensione di 5 oggetti. Così generazione 0 apparirebbe come sotto prima creazione dell'oggetto 6:
Dopo la creazione dell'oggetto 6, allocazione immondizia viene avviato che rilascia gli oggetti spazzatura 1, 3 e 5 e si muove 2 e 4 adiacenti a ciascun altro in Generation 1.
La dimensione bilancio di generazione 1 è inoltre selezionata per CLR all'inizializzazione. Creazione di oggetto 11 fa sì che il GC per ricominciare che possono spostare alcuni più oggetti in generazione 1.
Generation 1 viene ignorata per Garbage Collection fino a raggiungere la sua dimensione bilancio Rifiuti, che migliora le prestazioni di GC.
Generation 2:
Negli diversi raccolta generazione 0, 1 generazione può superare limite di budget che di che causano GC per raccogliere l'immondizia da entrambe le generazioni. In questo caso, i sopravvissuti di generazione 1 vengono promossi alla generazione 2, i sopravvissuti di generazione 0 vengono promossi alla generazione 1 e la generazione 0 è vuota.
Diciamo che l'oggetto di allocazione 21 causa il raggiungimento della Garbage Collection e della generazione 1.
Così mucchio sarà simile di seguito con l'oggetto che è sopravvissuto in Generation 1 promosso in generazione 2.
Quindi, fondamentalmente generazione GC presuppone che gli oggetti più recenti hanno più probabilità di raccolti.
Sappiamo che CLR seleziona i budget per tutte e tre le generazioni, ma può modificarli in quanto GC è un collettore di autotaratura. Se GC vede che ci sono pochissimi oggetti sopravvissuti dopo aver raccolto la generazione 0, potrebbe decidere di ridurre il budget della generazione 0, in modo che venga eseguito un lavoro minore. D'altra parte, se GC raccoglie la generazione 0 e vede che ci sono molti oggetti sopravvissuti, non è stata recuperata molta memoria nella garbage collection. In questo caso, il garbage collector aumenterà il budget della generazione 0. Il GC modifica anche i budget di generazione 1 e generazione 2 di conseguenza.
Ciao, puoi dirmi quando il collezionista raccoglie gli oggetti? Dopo l'esecuzione di ogni metodo? – Bigeyes
Non è appropriato fare domande come commento in una domanda di 7 anni. Ogni tutorial Java ti dirà che il GC funziona su un thread separato alla volta che lo sceglie. – duffymo
@duffymo e cosa ha a che fare il tutorial Java con la domanda di Bigeyes? Dalla mia dubbiosa domanda dell'OP riguarda .net – MaLiN2223