1. 程式人生 > >G1和CMS垃圾收集器

G1和CMS垃圾收集器

毫秒 最大 獲得 硬件 程序 不同的 優先 好的 修正

1.CMS收集器

Concurrent Mark Sweep CMS收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的java應用集中在互聯網站或者B/S系統的服務端上,這類應用尤其重視服務的相應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS收集器就非常符合這類應用的需求。

CMS是基於標記-清除 算法實現的,它的運作過程相對於前面幾種收集器來說更復雜一些,整個過程分為4個步驟,

初始標記:僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快,

並發標記階段:進行GC Roots Tracing的過程,而重新標記階段則是為了修正並發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比並發標記的時間短。

由於整個過程中耗時最長的並發標記和並發清除過程收集器線程都可以與用戶線程一起工作,所以,總體上來說,CMS收集器的內存回收過程是與用戶線程一起並發執行的。

2.G1收集器

是當今收集器技術發展的最前沿成果之一,G1是一款面向服務端應用的垃圾收集器。具有以下特點:

並行和並發:G1能充分利用多CPU、多核環境下的硬件優勢,使用多個CPU來縮短停頓時間,部分其他收集器原本需要停頓java線程執行的GC動作,G1收集器仍然可以通過並發的方式讓Java程序繼續執行。

分代收集:與其他收集器一樣,分代概念在G1中依然得以保留。雖然G1可以不需要其他收集器配合就能獨立管理整個GC堆,但它能夠采用不同的方式去處理新創建的對象和已經存活了一段時間、熬過多次GC的舊對象以獲取更好的收集效果。

空間整合: 與CMS的“標記-清理”算法不同,G1從整體來看是基於“標記-整理”算法實現的收集器,從局部看是基於“復制”算法實現的,但無論如何,都意味著G1運作期間不會產生內存空間碎片,收集後能夠提供規整的可用內存,這種特性有利於程序長時間運行,分配大對象時不會因為無法找到連續內存空間而提前觸發下一次GC

可預測的停頓:這是G1相對於CMS的另一大優勢,降低停頓時間是G1和CMS共同關註點, 但G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。

G1將整個java堆劃分為多個大小想等的獨立區域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔離了,它們都是一部分Region(不需要連續)的集合。

G1跟蹤各個region裏面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需時間的經驗值),在後臺維護一個優先列表,每次根據允許的手機時間,優先回收價值最大的Region。這種使用Region劃分內存空間以及有優先級的區域回收方式,保證了G1收集器在有限的時間內可以獲取盡可能高的手機效率。

G1和CMS垃圾收集器