CMS收集器
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器膘流。目前很大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度劈榨,希望系統(tǒng)停頓時間最短,以給用戶帶來較好的體驗赁炎。
CMS收集器是基于“標記-清除”算法實現(xiàn)的盾鳞,它的運作過程相對于前面幾種收集器來說更復(fù)雜,可以分為四個步驟:
- 初始標記(CMS initial mark)
- 并發(fā)標記(CMS concurrent mark)
- 重新標記(CMS remark)
-
并發(fā)清除(CMS concurrent sweep)
其中初始標記和重新標記仍然需要“Stop The World”拱燃。 初始標記只標記GC Roots能直接關(guān)聯(lián)到的對象,速度很快力惯, 并發(fā)標記階段就是進行GC Roots Tracing的過程碗誉,而重新標記階段則是為了修正并發(fā)標記期間因用戶程序繼續(xù)運作而導(dǎo)致標記產(chǎn)生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始階段稍長一些父晶,但是比并發(fā)標記時間短哮缺。
CMS
CMS的優(yōu)點是并發(fā)收集,低停頓甲喝,但是有三個明顯的缺點:
- CMS收集器對CPU資源非常敏感尝苇。面向并發(fā)設(shè)計的程序都對CPU敏感。在并發(fā)階段雖然不會導(dǎo)致用戶線程停止埠胖,但是會因為占用一部分線程(或者說CPU資源)而導(dǎo)致應(yīng)用程序變慢糠溜,總吞吐量會降低。
- CMS 收集器無法處理浮動垃圾(Floating Garbage)直撤,可能出現(xiàn)(Concurrent Mode Failure)失敗而導(dǎo)致另一次Full GC的產(chǎn)生非竿。因為CMS并發(fā)清理階段用戶線程還在運行著,伴隨著程序運行自然就會產(chǎn)生新的垃圾谋竖,這一部分垃圾出現(xiàn)在標記過程之后红柱,CMS無法當次收集這些垃圾。這一部分垃圾就稱為浮動垃圾蓖乘。
- 還有最后一個缺點是CMS 是基于“標記-清除”算法實現(xiàn)的收集器豹芯,這種收集算法會在垃圾手機結(jié)束時產(chǎn)生大量的碎片∏茫空間碎片過多時,將會給大對象的分配帶來很大的麻煩宽闲,往往會出現(xiàn)老生代還有很大的空間剩余众眨,但是無法找到足夠大的連續(xù)空間來分配當前對象,不得不提前觸發(fā)一次Full GC
G1 收集器
G1(Garbage-Frist)收集器是當今收集器技術(shù)發(fā)展最前沿的成果之一容诬,G1是一款面相服務(wù)端應(yīng)用的垃圾收集器娩梨。HotSpot計劃使用G1收集器替換掉JDK1.5中發(fā)布的CMS收集器, 與其他收集器相比G1具備以下幾個特點:
- 并行和并發(fā):G1能充分利用多CPU,多核環(huán)境下的硬件優(yōu)勢览徒,使用多個CPU(CPU或者CPU核心)來縮短STW停頓時間狈定,部分其他收集器原本需要停頓Java線程執(zhí)行的GC動作,G1收集器仍然可以通過并發(fā)的方式讓Java程序繼續(xù)執(zhí)行。
- 分代收集:與其他收集器一樣纽什,分代的概念在G1中依然存在措嵌。雖然G1可以不需要其他收集器配合就能管理整個GC堆,但它能夠采用不同的方式去處理新創(chuàng)建的對象和已經(jīng)存活了一段時間芦缰、熬過多次GC的舊對象以獲取更好的收集效果企巢。
- 空間整合:G1 從整體來看是基于“標記-整理”算法實現(xiàn)的收集器,從局部(兩個region)上來看是基于“復(fù)制”算法實現(xiàn)的让蕾,這兩種算法在收集期間都會導(dǎo)致內(nèi)存碎片浪规,不會應(yīng)為大對象內(nèi)存無法分配而導(dǎo)致Full GC
- 可預(yù)測的停頓: G1可以建立可預(yù)測的停頓時間模型,能讓使用者明確指定一個長度為M毫秒的時間片段內(nèi)探孝,消耗在垃圾收集上的時間不得超過N毫秒笋婿。
G1收集器的運作步驟大致分為4步:- 初始標記( Initial Marking)
- 并發(fā)標記( Concurrent Marking)
- 最終標記(Final Marking)
-
篩選回收( Live Data Counting and Evacuation)
前兩步和CMS類似,最終標記是為了修正并發(fā)標記期間因用戶程序繼續(xù)運作而導(dǎo)致標記產(chǎn)生變動的那一部分標記記錄顿颅,虛擬機將這段事件對象的變化記錄在線程Remembered Set Logs里面缸濒,最終標記階段需要把Remembered Set Logs的數(shù)據(jù)合并到Remembered Set中,這階段需要停頓線程元镀,但是可并行執(zhí)行绍填。最后在篩選回收階段首先對各個Region的回收價值和成本進行排序,根據(jù)用戶所期望的GC停頓時間來制定回收計劃栖疑,這個階段也可以做到和用戶線程并發(fā)執(zhí)行讨永。
G1