今天開始實戰Java虛擬機之三:「G1的新生代GC」。
總計有5個系列
實戰Java虛擬機之一「堆溢出處理」
實戰Java虛擬機之二「虛擬機的工做模式」
實戰Java虛擬機之三「G1的新生代GC」
實戰Java虛擬機之四「禁用System.gc()」
實戰Java虛擬機之五「開啓JIT編譯」java
新生代GC的主要工做是回收eden區和survivor區。一旦eden區被佔滿,新生代GC就會啓動。新生代GC收集先後的堆數據如圖5.6所示,其中E表示eden區,S表示survivor區,O表示老年代。能夠看到,新生代GC只處理eden和survivor區,回收後,全部的eden區都應該被清空,而survivor區會被收集一部分數據,可是應該至少仍然存在一個survivor區,類比其餘的新生代收集器,這一點彷佛並無太大變化。另外一個重要的變化是老年代的區域增多,由於部分survivor區或者eden區的對象可能會晉升到老年代。
圖5.6 G1的新生代GCjvm
新生代GC發生後,若是打開了PrintGCDetails選項,就能夠獲得相似如下的GC日誌(這裏只給出了部分日誌,徹底的日誌及其分析請看《實戰Java虛擬機》一書第5.4.6節):spa
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。.net
節選自
《實戰java虛擬機》一書Q交流羣:397196583日誌