![](http://static.javashuo.com/static/loading.gif)
Serial
使用拷貝算法的垃圾回收器,適用於新生代。Serial回收器使用單線程進行垃圾回收。算法
SerialOld
使用標記-壓縮算法的垃圾回收器,適用於老年代。使用單線程進行垃圾回收。數據結構
ParNew
Serial回收器的多線程版本,使用拷貝算法,多線程並行工做。在多CPU主機上的性能高於Serial,單CPU主機上的性能低於Serial。多線程
Parallel Scavenge
與ParNew同樣,都是用於新生代的並行拷貝算法回收器。區別在於Parallel Scavenge回收器能夠控制新生代垃圾回收的stop the world時間。 併發
Parallel Old
Parallel Scavenge的老年代版本性能
Concurrent Mark Sweep(CMS)
CMS是標記-清除的改進算法,用於老年代,可以有效減小STW時長。
CMS是一種比較複雜的垃圾回收算法,此處儘量進行簡明扼要的介紹:
CMS將標記-清除細分爲6個階段:spa
- 初始標記
- 併發標記
- 併發預清理
- 從新標記
- 併發清理
- 併發重置
詳細過程:線程
- 初始標記階段中,CMS回收器標記出被GC Roots直接引用的對象,這一過程須要STW,但因爲只進行深度爲1的遍歷,耗時很短。
- 併發標記階段中,CMS回收器以初始標記階段標記出的存活對象爲根進行可達性遍歷。在這一階段中,不須要STW,其餘線程可正常運行。
- 併發預清理階段中,CMS回收器對併發標記階段中老年代新增的對象從新進行標記。這一階段存在的目的是儘量減小下一階段「從新標記」的STW時長。
- 從新標記階段會進入STW,而後進行一次完整的可達性分析,因爲前面三個階段已經完成了絕大部分的工做,因此這一階段的STW會很短。
- 併發清理階段不須要STW,垃圾回收線程清理標記出的垃圾對象,同時其餘線程能夠正常工做。
- 併發重置階段中,重置CMS回收器的數據結構,等待下一次垃圾回收。
能夠看出來,CMS回收器的思路是把標記-清除算法的工做拆分紅多個步驟,其中能夠並行的儘量並行,以達到STW時長最小化的目標。
一樣地,CMS回收器也存在着弊端:對象
- 對CPU要求高,因爲部分標記和清除階段是免STW而且多線程並行的,這就給CPU增長了很大的線程切換壓力,核數少的CPU使用CMS回收器的效果並很差,多核多CPU的高性能主機更加適合使用
- 垃圾回收的同時老年代中仍然在產生新的對象,這是CMS的並行機制致使的。因此CMS回收器不能在老年代滿時纔開始工做,Hotspot VM 6/7中,CMS回收器在老年代使用率92%時便開始工做。若是在CMS垃圾回收的過程當中,新增的對象佔滿了剩餘的8%空間,便會致使CMS回收失敗,自動降級至SerialOld從新進行垃圾回收。(CMS垃圾回收觸發的時機可使用-XX:CMSInitiatingOccupancyFraction參數進行設置)
- CMS使用的是標記-清除算法,而不是標記-壓縮算法,這就致使會出現大量的內存碎片。隨着內存碎片的增多,最終勢必會出現垃圾回收的併發階段中內存不足的狀況,如上所說,此時CMS回收器會自動降級爲SerialOld回收器,以標記-壓縮算法進行垃圾回收,同時也就會整理好內存碎片。
綜上所述能夠看出,CMS回收器的機制比前述的任何一種都要精細和複雜,同時對CPU資源的要求也要高出不少,以犧牲性能的代價換取最少的STW時長。內存
G1