今天開始實(shí)戰(zhàn)Java虛擬機(jī)之三:“G1的新生代GC”。
總計(jì)有5個(gè)系列
新生代GC的主要工作是回收eden區(qū)和survivor區(qū)。一旦eden區(qū)被占滿,新生代GC就會(huì)啟動(dòng)。新生代GC收集前后的堆數(shù)據(jù)如圖5.6所示,其中E表示eden區(qū),S表示survivor區(qū),O表示老年代。可以看到,新生代GC只處理eden和survivor區(qū),回收后,所有的eden區(qū)都應(yīng)該被清空,而survivor區(qū)會(huì)被收集一部分?jǐn)?shù)據(jù),但是應(yīng)該至少仍然存在一個(gè)survivor區(qū),類比其他的新生代收集器,這一點(diǎn)似乎并沒有太大變化。另一個(gè)重要的變化是老年代的區(qū)域增多,因?yàn)椴糠謘urvivor區(qū)或者eden區(qū)的對(duì)象可能會(huì)晉升到老年代。

圖5.6 G1的新生代GC
新生代GC發(fā)生后,如果打開了PRintGCDetails選項(xiàng),就可以得到類似以下的GC日志(這里只給出了部分日志,完全的日志及其分析請(qǐng)看《實(shí)戰(zhàn)Java虛擬機(jī)》一書第5.4.6節(jié)):
0.336: [GC pause (young), 0.0063051 secs]…. [Eden: 235.0M(235.0M)->0.0B(229.0M) Survivors: 5120.0K->11.0M Heap: 239.2M(400.0M)->10.5M(400.0M)] [Times: user=0.06 sys=0.00, real=0.01 secs]
和其他回收器的日志相比,G1的日志內(nèi)容非常豐富。當(dāng)然我們最為關(guān)心的依然是GC的停頓時(shí)間以及回收情況。從日志中可以看到,eden區(qū)原本占用235M空間,回收后被清空,survivor區(qū)從5M增長到了11M,這是因?yàn)椴糠謱?duì)象從eden區(qū)復(fù)制到survivor區(qū),整個(gè)堆合計(jì)為400M,從回收前的239M下降到10.5M。
實(shí)戰(zhàn)Java虛擬機(jī)之一“堆溢出處理”
實(shí)戰(zhàn)Java虛擬機(jī)之二“虛擬機(jī)的工作模式”
節(jié)選自

《實(shí)戰(zhàn)Java虛擬機(jī)》一書Q交流群:397196583
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注