2011-10-27 17 views
5

Gen 0: Quindi ho letto i trigger gen 0 quando gen 0 supera una soglia di dimensione. Ma ho anche letto che GC non viene eseguito in un "nuovo", perché "nuovo" semplicemente scorre un indirizzo in avanti. Quindi, quando controlla che abbia superato la soglia per attivare il gen 0 GC?Quando fa esattamente gen 0, gen 1, gen 2?

Gen 1/2: Do gen 1/2 hanno la propria soglia di dimensione che attiva GC? Quando considerano la soglia? È il momento in cui i sopravvissuti vengono promossi al gen?

Significa che per un GC di gen 1 si verifichi prima controlla gen 0, quindi li promuove a gen 1, solo per scoprire che gen 1 ha superato la soglia e quindi controlla gen 1 e controlla nuovamente gen 0?

E ciò significa che un GC di gen 2 si verifica prima controlla gen 0, quindi li promuove a gen 1, solo per scoprire che gen 1 ha superato la soglia e quindi controlla gen 1 e controlla nuovamente gen 0. Quindi promuove gen 0 a gen 1 e gen 1 a gen 2, solo per scoprire che gen 2 ha superato la soglia e quindi ricontrolla nuovamente gen 2, gen 1 e gen 0?

+4

Tutti questi dettagli sono dettagli di implementazione interna di proprietà, variano da implementazione a implementazione e sono soggetti a modifiche in qualsiasi momento. Inoltre, il GC gira su una propria discussione, quindi anche la programmazione dei thread è un fattore. Se potessi dire perché ti interessi, questo ti aiuterà a ottenere una risposta migliore. Se ti interessa, ad esempio, perché vuoi sapere quando sei in pericolo di una raccolta costosa che accade in un brutto momento, ci sono modi in cui puoi scoprirlo * senza * conoscere i dettagli interni del GC. –

+0

Mi interessa perché devo spiegarlo a persone che non conoscono totalmente GC e ho scoperto che conosco semplicemente l'effetto ma non ne conosco la causa. Inoltre, non so quali non siano i dettagli di implementazione e quali sono tali che non devo spiegare. –

+1

Se ti interessa quando il GC entra in azione, stai sbagliando. – leppie

risposta

0

Gen 0 si attiva quando la VM ha esaurito la memoria.
Gen 1 si attiva quando Gen 0 non ha liberato memoria sufficiente ed è ancora senza memoria.
Gen n trigger quando Gen n - 1 non ha memoria sufficiente ed è ancora senza memoria.
Se raggiunge l'ultimo Gen e non ha ancora abbastanza memoria, viene allocata nuova memoria.

+0

Vuoi dire che per un GC di gen 2 si verifica prima controlla gen 0, poi li promuove a gen 1, solo per scoprire che gen 1 ha superato la soglia e quindi controlla gen 1, e controlla di nuovo gen 0. Quindi promuove gen 0 a gen 1 e gen 1 a gen 2, solo per scoprire che gen 2 ha superato la soglia e quindi ricontrolla nuovamente gen 2, gen 1 e gen 0? –

+0

Tutto viene promosso dopo che la memoria è già a posto e indipendentemente dal successo di una raccolta. Dopo essere passati a gen 1 e la collezione non ha avuto successo, andrà a gen2, non indietro. – Dani

1

Dopo l'inizializzazione CLR, gli oggetti che vengono prima aggiunti all'heap gestito sono definiti come Gen0. Quando il GC è stato eseguito, la generazione degli oggetti che non sono stati raccolti aumenterà di 1 livello e diventerà Gen1. Gli oggetti creati dopo sono ancora Gen0. Con gli oggetti creati, solo se la memoria rilasciata dagli oggetti Gen0 non è sufficiente per creare nuovi oggetti e il volume in Gen1 supera la capacità, GC raccoglierà gli oggetti Gen0 e Gen1. Successivamente, gli oggetti non raccolti in Gen1 diventeranno Gen2 e gli oggetti non raccolti in Gen0 diventeranno Gen1. Gli oggetti creati dopo sono ancora Gen0.

Problemi correlati