在前兩篇博文中講解了新生代和年老代的收集器,在本篇博文中介紹一個收集範圍涵蓋整個堆的收集器——G1收集器。
先講講G1收集器的特色,他也是個多線程的收集器,可以充分利用多個CPU進行工做,收集方式也與CMS收集器相似,所以不會有過久的停頓。
雖然回收的範圍是整個堆,但仍是有分代回收的回收方式。在年輕代依然採用複製算法;年老代也一樣採用「標記-清除-整理」算法。可是,新生代與老年代在堆內存中的佈局就和以往的收集器有着很大的區別:G1將整個堆分紅了一個個大小相等的獨立區域,叫作region。其中依然保存着新生代和年老代的概念,如圖:
是否是和以前博文中看到的不一樣(這是內存空間圖,不要和垃圾回收的圖弄混了),以往只是簡單的分區域,而這裏是將整個堆分紅多個大小相等的區域。
他的回收過程也分爲四個部分:初始標記、併發標記、最終標記、篩選回收。
你們是否是以爲很熟悉!上面咱們也說過了,和CMS收集器相似,初始標記須要STW;併發標記不須要;最終標記就是作一些小修改,須要STW;而篩選回收則有些不一樣,在衆多的region中,每一個region可回收的空間各不相同,可是回收所消耗的時間是須要控制的,不能太長,所以G1就會篩選出一些可回收空間比較大的region進行回收,這就是G1的優先回收機制。這也是保證了G1收集器能在有限的時間內可以得到最高回收效率的緣由。經過-XX:MaxGCPauseMills=50毫秒設置有限的收集時間。
每一個region之間的對象引用經過remembered set來維護,每一個region都有一個remembered set,remembered set中包含了引用當前region中對象的指針。虛擬機正是經過這個remembered set去避免對整個堆進行掃描來確承認回收的對象。
到此,全部的收集器都已經講完了,可是很重要的一點:每一個收集器是不能隨意進行組合使用的!這裏我列出一個搭配使用的表格提供你們參考使用: 多線程
G1收集器併發、併發執行內存回收架構