Young Gen新生代演算法

2021-08-28 01:43:35 字數 738 閱讀 1252

sun/oracle 的 hotspot jvm 又把新生代進一步劃分為 3 個區域:

1. 乙個相對大點的區域,稱為「伊甸園區 (eden)」;

2. 兩個相對小點的區域稱為「from 倖存區 (survivor)」 和「to 倖存區 (survivor)」。

按照規定,新物件會首先分配在 eden 中 (如果新物件過大,會直接分配在老年代中)。在 gc 中,eden 中的物件會被移動到 survivor 中,直至物件滿足一定的年紀 (定義為熬過 gc 的次數),會被移動到老年代。

新生代的 gc 使用複製演算法:

1. 在 gc 前 to 倖存區 (survivor) 保持清空

2. eden 中的倖存物件被複製到 to 倖存區 (survivor)。

3. 針對 from 倖存區 (survivor) 中的倖存物件

[list]

[*]a. 會考慮物件年齡,如果年齡沒達到閥值 (tenuring threshold),物件會被複製到 to 倖存區 (survivor)。

[*]b. 如果達到閥值物件被複製到老年代。

[*]c. 複製階段完成後,eden 和 from 倖存區中只儲存死物件,可以視為清空。

[/list]

4. 如果在複製過程中 to 倖存區被填滿了,剩餘的物件會被複製到老年代中。

5. 最後 from 倖存區和 to 倖存區會調換下名字,在下次 gc 時,to 倖存區會成為 from 倖存區。

ref:[url]

新生代的配置

引數 xmn可以用於設定新生代的大小。設定乙個較大的新生代大小會減少老年代的大小,此引數對系統效能以及gc影響很大。新生代的大小一般設定為整個堆空間的1 3到1 4左右。引數 xx survivorratio用來設定新生代中eden空間和from to空間的比例關係,如下 xx survivorra...

YGC前後新生代變大?

我們都知道gc是為了釋放記憶體,但是你是否碰到過ygc前後新生代反增不減的情況呢?gc日誌效果類似下面的 2016 05 18t15 06 13.011 0800 gc parnew promotion failed 636088k 690555k 707840k 0.2958900 secs cm...

新生代的複製 清除演算法實現原理

在新生代的複製演算法中將除新生代的eden區域以外的記憶體空間一分為二,分別稱為s0區和s2區 s0和s1將可用記憶體按容量分成大小相等的兩塊,每次只使用其中一塊,當這塊記憶體使用完了,就將還存活的物件複製到另一塊記憶體上去,然後把使用過的記憶體空間一次清理掉。這樣使得每次都是對其中一塊記憶體進行 ...