1. 程式人生 > >JVM中GC機制的個人理解

JVM中GC機制的個人理解

 

該圖代表jvm中的新生代,老年代,持久代;  新生代和老年代主要指堆區(管理物件),持久代主要指方法區(因為方法區裡是類資訊,靜態變數,常量等需要“持久”的資訊);我們這裡主要看堆區的gc;

新生代:裡主要分為Eden Space  和Survivor兩塊;Eden代表“伊甸園”,新生的物件都會放到這裡,Survivor (翻譯為倖存,這裡我理解為在Eden區gc時,未被回收的物件會放到這個辛存區;)又包括FromSpace和ToSpace兩個區域,這兩個區域大小是一樣的;FromSpace我理解為進行復制演算法的來源區,ToSpace理解為要放的地方;

老年代:主要存放經過多次gc還存活的物件,新生代的物件可以設定年齡閥值,超過年齡閥值的物件會轉到老年代;老年代採用的是標記壓縮演算法(相較於標記清除演算法不會產生記憶體碎片)

總結理解:在GC開始的時候,物件只會存在於Eden區和名為“From”的Survivor區,Survivor區“To”是空的。緊接著進行GC,Eden區中所有存活的物件都會被複制到“To”,而在“From”區中,仍存活的物件會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設定)的物件會被移動到年老代中,沒有達到閾值的物件會被複制到“To”區域。經過這次GC後,Eden區和From區已經被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到“To”區被填滿,“To”區被填滿之後,會將所有物件移動到年老代中。

補充方法區和持久代的關係:方法區物理上存在於堆裡,而且是在堆的持久代裡面;但在邏輯上,方法區和堆是獨立的。
                                           一般說堆的持久代就是說方法區;

參考:https://www.cnblogs.com/nanta