實戰Java虛擬機之三:「G1的新生代GC」

今天開始實戰Java虛擬機之三:「G1的新生代GC」。jvm

總計有5個系列spa

    新生代GC的主要工做是回收eden區和survivor區。一旦eden區被佔滿,新生代GC就會啓動。新生代GC收集先後的堆數據如圖5.6所示,其中E表示eden區,S表示survivor區,O表示老年代。能夠看到,新生代GC只處理eden和survivor區,回收後,全部的eden區都應該被清空,而survivor區會被收集一部分數據,可是應該至少仍然存在一個survivor區,類比其餘的新生代收集器,這一點彷佛並無太大變化。另外一個重要的變化是老年代的區域增多,由於部分survivor區或者eden區的對象可能會晉升到老年代。ci

5-6

圖5.6  G1的新生代GCget

新生代GC發生後,若是打開了PrintGCDetails選項,就能夠獲得相似如下的GC日誌(這裏只給出了部分日誌,徹底的日誌及其分析請看《實戰Java虛擬機》一書第5.4.6節):虛擬機

1
2
3
4
5
6
7
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的日誌內容很是豐富。固然咱們最爲關心的依然是GC的停頓時間以及回收狀況。從日誌中能夠看到,eden區本來佔用235M空間,回收後被清空,survivor區從5M增加到了11M,這是由於部分對象從eden區複製到survivor區,整個堆合計爲400M,從回收前的239M降低到10.5M。

 

實戰Java虛擬機之一「堆溢出處理」

實戰Java虛擬機之二「虛擬機的工做模式」

節選自

25612fm立體圖

《實戰Java虛擬機》一書Q交流羣:397196583

相關文章
相關標籤/搜索