2011-10-27 22 views
5

Gen 0: 因此,當gen 0超過大小閾值時,我讀取了gen 0觸發器。但我也讀到,GC不是在「新」上執行的,因爲「新」只是向前推進一個地址。那麼,它什麼時候檢查它已經超過了觸發gen 0 GC的閾值?何時gen 0,gen 1,gen 2準確觸發?

Gen 1/2: 第1/2代有其自己的大小閾值觸發GC?他們什麼時候考慮門檻?是倖存者晉升爲創世紀的時候嗎?

這是否意味着一個gen 1 GC發生,它首先檢查gen 0,然後將它們升級到gen 1,只發現gen 1已經超過閾值,因此它檢查gen 1,並再次檢查gen 0?

這是否意味着第2代GC發生首先檢查第0代,然後將它們提升到第1代,只發現第1代已超過閾值,因此它檢查第1代,並再次檢查第0代。然後促使第0代第1代和第1代第2代,只發現第2代已超過閾值,因此它再次檢查第2代,第1代和第0代?

+4

所有這些細節都是專有的內部實施細節,因實施情況而異,並隨時可能發生變化。另外,GC在其自己的線程上運行,因此線程調度也是一個因素。如果你能說出你爲什麼在意,那將有助於你得到更好的答案。例如,如果你關心的是,因爲你想知道什麼時候你有一個昂貴的收藏發生在一個不好的時間,那麼你可以在不知道GC的內部細節的情況下找到它。 –

+0

我很在乎,因爲我必須向完全不瞭解GC的人解釋,我發現我只知道效果,但我不知道原因。我也不知道哪些不是實現細節,哪些是我不需要解釋的。 –

+1

如果你關心什麼時候GC啓動,你做錯了。 – leppie

回答

0

當虛擬機內存不足時,第0代會觸發。
當Gen 0沒有釋放足夠的內存並且內存不足時,Gen 1會觸發。
Gen n - 1沒有釋放足夠的內存並且內存不足時觸發第n代。
如果它到達最後一代並且仍然沒有釋放足夠的內存,則分配新的內存。

+0

您的意思是說,對於第2代GC發生它首先檢查第0代,然後將它們提升到第1代,只發現第1代已超過閾值,因此它檢查第1代,並再次檢查第0代。然後促使第0代第1代和第1代第2代,只發現第2代已超過閾值,因此它再次檢查第2代,第1代和第0代? –

+0

內存已經正常並且不管集合是否成功,所有內容都會得到提升。進入第一代後,收集不成功,它會去gen2,而不是回來。 – Dani

1

CLR初始化後,首先添加到託管堆中的對象被定義爲Gen0。當GC執行時,未收集的物體的生成將增加1級併成爲Gen1。之後創建的對象仍然是Gen0。創建對象時,只有Gen0對象釋放的內存不足以創建新對象,並且Gen1中的卷超出容量時,GC纔會收集Gen0和Gen1對象。之後,未在Gen1中收集的對象將成爲Gen2,未在Gen0中收集的對象將成爲Gen1。之後創建的對象仍然是Gen0。