2015-10-07 70 views
0

我正在學習垃圾收集如何工作。垃圾收集 - 老一代

我與年輕一代清楚,但與老一代

當老一代已滿,進行重大GC然後會發生什麼?

所有對象是活的還是死的都從老一代中刪除,或者只有已死的對象被刪除?

如果老一代中的所有對象在主要gc時都是活的,那麼會發生什麼?它會拋出OutOfMemoryError嗎?

回答

1

年輕一代:大部分新創建的對象都位於此處。由於大多數物體很快變得無法到達,許多物體在年輕一代中被創造出來,然後消失。當物體從這個區域消失時,我們說發生了「次要GC」。

老一代:從年輕一代沒有變得無法達到並倖存的物體被複制到這裏。它通常比年輕一代大。由於它的規模較大,GC的發生頻率比年輕一代少。當物體從舊一代消失時,我們說「主要GC」(或「完整GC」)已經發生。

oldgen:這個池基本上包含tenured和虛擬(保留)空間,並將持有從YoungGen空間垃圾收集後倖存下來的那些對象。

如果老一代變滿了,將會拋出OOM

Q & A 

當老一代已滿並且執行主要gc時會發生什麼? Objects are removed from memory.

所有對象是活的還是死的都從老一代中刪除或者只有已死的物體被刪除? only dead objects are removed, objects which are still referenced still live in old

如果老一代的所有物體都是活的,那麼會發生什麼?

Does it throws OutOfMemoryError? OOM will be thrown 
1

只有那些不可達的對象纔會被GC刪除。 所以是的,如果舊代堆中的所有對象都可以訪問,JVM將拋出OutOfMemoeryError。

老一代:未成爲不可達,從年輕一代倖存的對象複製到此處。它通常比年輕一代大。由於它的規模較大,GC的發生頻率比年輕一代少。當物體從舊一代消失時,我們說「主要GC」(或「完整GC」)已經發生。

您可能會看到here瞭解更多詳情。

+0

好的..謝謝.. !! :) – Devloper

+0

如果我想刪除該錯誤,那麼是否有任何方式通過編碼? – Devloper

+0

沒有辦法通過編碼來處理OutOfMemory。請記住,可以處理異常,但不能處理錯誤。但是,您可以爲應用程序配置JVM參數,以便在應用程序崩潰時獲取堆轉儲。你也可以調整應用程序的堆大小,以便這種情況不會發生在第一位。 – Batty