G1收集器是當今收集器技術(shù)發(fā)展的最前沿成果之一。它是一款面向服務器應用的垃圾收集器忙上。研發(fā)團隊希望它未來可以替代掉CMS收集器调俘。
特點:
1.并行與并發(fā):G1能充分利用多CPU辜窑、多核環(huán)境下的硬件優(yōu)勢奖恰,使用多個CPU或是CPU核心來縮短stop the world的停頓時間吊趾。
2.分代收集:與其它收集器一樣,分代概念依然存在房官,雖然G1可以不需要與其它收集器配合就能獨立管理整個GC堆趾徽,但它能夠采用不同的方式去處理新創(chuàng)建的對象和已經(jīng)存活了一段時間续滋、熬過多次GC的舊對象以獲取更好的收集效果翰守。
3.空間整合:從整體上看,G1是基于“標記-整理”算法實現(xiàn)的和CMS的標記清理不同疲酌。而從局部上看兩個Region之間用了復制算法蜡峰。但是無論是哪種算法都不會留下空間碎片,這樣就可以保證G1收集器長時間運行朗恳,分配大對象時不會因為無法找到連續(xù)空間而提前觸發(fā)下一次GC湿颅。
4≈嘟耄可預測停頓:相對于CMS收集器來說G1還有一個優(yōu)勢是可以建立停頓預測模型油航,這讓用戶可以在明確指定在一個長度為M毫秒內(nèi)的時間片段內(nèi)消耗在垃圾收集時間不超過N毫秒。
內(nèi)存布局:
? ? ? ?G1收集器將整個Java堆分為多個大小相等的獨立區(qū)域(Region)怀浆,雖然還留著老年代和新生代的概念谊囚,但這兩者不在是物理隔離了怕享。
? ? ? ?G1之所以高效且停頓時間可預測,是因為收集器有計劃的避免在全區(qū)域進行垃圾收集镰踏,G1跟蹤各個Region里面的垃圾堆積價值大泻睢(回收所獲得的空間大小以及回收所需時間的經(jīng)驗值),在后臺維護一個優(yōu)先列表奠伪,每次根據(jù)允許的回收時間跌帐,優(yōu)先回收價值最大的Region。
? ? ? ?但是Region不可能是孤立的绊率,一個對象分配在某個Region中谨敛,它并非只能被本Region中的其他對象所引用而是可以與整個Java堆任意的對象發(fā)生引用關系。為了避免在做可達性分析時掃描整個Java堆滤否。在G1收集器的Region之間的對象引用以及其它收集器中的新生代與老年代之間的對象引用佣盒,虛擬機都是使用Remembered Set來避免全堆掃描的。
? ? ? ?G1中每個Region都有一個與之對應的Remembered Set顽聂,虛擬機發(fā)現(xiàn)程序在對Reference類型的數(shù)據(jù)進行寫操作時肥惭,會產(chǎn)生一個Write Barrier暫時中斷寫操作,檢查Reference引用的對象是否處于不同的Region之中(在分代的例子中就是檢查老年代中的對象引用了新生代中的對象)紊搪,如果是蜜葱,便通過CardTable把相關引用信息記錄到被引用對象所屬的Region的Remembered Set之中。當進行內(nèi)存回收時耀石,在GC根節(jié)點的枚舉范圍中加入Remembered Set即可保證不對全堆掃描也不會有遺漏牵囤。
回收過程:
1.初始標記:
僅僅只標記一下GC Roots能直接關聯(lián)到的對象,并且修改TAMS(Next Top at Mark Start)的值滞伟,讓下一階段用戶程序并發(fā)運行時揭鳞,能在正確可用的Region中創(chuàng)建新對象,這階段需要停頓線程梆奈,但耗時比較短野崇。
2.并發(fā)標記:
該階段時在用戶線程進行時同時并發(fā)對堆中對象做可達性分析,找出存活的對象亩钟,這階段耗時長但是并發(fā)進行乓梨。
3.最終標記:
為了修正在并發(fā)階段因系統(tǒng)繼續(xù)運行而產(chǎn)生變動得那一部分標記記錄。虛擬機將這段時間的變化記錄在Remembered Set Logs里面清酥,最終標記階段需要把Remembered Set Logs里的數(shù)據(jù)合并到Remembered Set里扶镀,這階段可停頓線程,但是可并行執(zhí)行焰轻。
4.篩選回收:
首先對各個Region的回收價值和成本進行排序臭觉,根據(jù)用戶所期望的GC停頓時間來制定回收計劃,這個階段其實也可以和用戶線程一起并發(fā)執(zhí)行的,但是因為只回收一部分Region蝠筑,時間是用戶可控制的忆肾,而且停下用戶線程將大幅提高收集效率。