2010-02-13 36 views

risposta

37

Da Understanding Garbage Collection in .NET

Generazioni

Un garbage collector generazionale raccoglie gli oggetti di breve durata più frequentemente di quelli più a lungo vissuto. oggetti breve durata sono memorizzati nella prima generazione, la generazione 0. Le oggetti più longevo vengono spinti nella le generazioni più alte, 1 o 2. Il collettore garbage funziona in modo più frequente nelle generazioni più bassi rispetto al quelli più alti.

Quando un oggetto viene creata, è messo nella generazione 0. Quando il generazione 0 è riempito, il garbage collector viene richiamato. Gli oggetti che sopravvivono la raccolta dei rifiuti nel primo generazione sono promossi sul immediatamente superiore generazione, generazione 1. gli oggetti che sopravvivono garbage collection nella generazione 1 sono promossi sul successivo e la più alta generazione, generazione 2 Questo algoritmo funziona in modo efficiente per la raccolta di oggetti obsoleti , poiché è veloce. Nota che la generazione 2 è la generazione più alta che è supportata dal garbage collector.

Garbage Collection in .NET

Generazioni

Mentre allocazione di memoria sul heap gestito è veloce, GC si potrebbe richiedere del tempo. A tal fine sono state apportate diverse ottimizzazioni per migliorare le prestazioni. GC supporta il concetto di generazioni, basato sul presupposto che il più un oggetto è stato nell'heap, più a lungo rimarrà probabilmente lì. Quando un oggetto viene allocato su , l'heap appartiene alla generazione 0. Ogni garbage collection che sopravvive dell'oggetto aumenta la sua generazione di di 1 (attualmente la più alta generazione supportata da è 2). Ovviamente è più veloce per la ricerca in e spazzatura raccogliere un sottoinsieme di tutti oggetti sul mucchio, in modo che il GC ha la possibilità di raccogliere solo generazione 0, 1 o 2 oggetti (o qualunque combinazione che sceglie fino a quando non ha memoria sufficiente). Anche se raccoglie solo oggetti più giovani, GC può determinare se gli oggetti vecchi hanno riferimenti a nuovi oggetti per assicurare che non ignora inavvertitamente gli oggetti in uso. .

17

C'è una bella descrizione in "Pro C# 2008":

  1. Generation 0 identifica un oggetto appena creato che non è mai stato contrassegnato per la raccolta
  2. Generation 1 identifica un oggetto che è sopravvissuto un GC (contrassegnato per la raccolta ma non rimosso perché lo spazio disponibile era sufficiente)
  3. La seconda generazione identifica un oggetto che è sopravvissuto a più di una scansione del GC.
+0

Ciao, puoi dirmi quando il collezionista raccoglie gli oggetti? Dopo l'esecuzione di ogni metodo? – Bigeyes

+0

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

+0

@duffymo e cosa ha a che fare il tutorial Java con la domanda di Bigeyes? Dalla mia dubbiosa domanda dell'OP riguarda .net – MaLiN2223

5

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:

enter image description here

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.

enter image description here

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.

enter image description here

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. enter image description here

Così mucchio sarà simile di seguito con l'oggetto che è sopravvissuto in Generation 1 promosso in generazione 2.

enter image description here

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.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17323312) – 1ac0

+1

Copiato il contenuto dal blog per rispondere. –

+1

@DeepakMishra grazie per aver modificato la tua risposta. Ora è bello e lo sforzo è molto apprezzato. – g00glen00b