經典垃圾收集器
- 1.Serial收集器
- 2.ParNew收集器
- 3.Parallel Scavenge收集器
- 4.Serial Old收集器
- 5.Parallel Old收集器
- 6.CMS收集器
- 7.Garbage First收集器
1.Serial收集器
Serial收集器是最基礎,歷史最久遠的收集器,是一款新生代收集器,新生代收集采用的是“標記-復制演算法”;它的作業方式是“單執行緒”,此處的單執行緒不僅是指它只會用一個處理器或一條收集執行緒去完成垃圾收集作業,更重要的是強調它在垃圾收集的時候,必須暫停其他所有作業的執行緒,包括用戶執行緒,知道它收集結束,所以說,“Stop The World”(STW)可不是白叫的,
2.ParNew收集器
ParNew收集器實際上是Serial收集器的多執行緒并行版本,從名字就可以看出它也是一款新生代的收集器,
但是此處的多執行緒并行不是說它可以沒有SWT,下面解釋一下收集器并發和并行的概念:
- 并行(Parallel): 并行描述的是多條垃圾收集器執行緒之間的關系,說明同一時間有多條這樣的執行緒在協同作業,通常默認此時用戶執行緒是處于等待狀態,
- 并發(Concurrent):并發描述的是垃圾收集器執行緒與用戶執行緒之間的關系,說明同一時間垃圾收集器執行緒與用戶執行緒都在運行,由于用戶執行緒并未被凍結,所以程式仍然能回應服務請求,但由于垃圾收集器執行緒占用了一部分系統資源,此時應用程式的處理的吞吐量將受到一定影響,
- —摘自《深入理解Java虛擬機》
3.Parallel Scavenge收集器
Parallel Scavenge收集器也是一款新生代的收集器,同樣基于“標記-復制演算法”實作,作業方式也是并行收集的多執行緒收集器,但它有一個最大特點是:盡量達到一個可控制的吞吐量,
比如完成一個任務,用戶代碼加上垃圾收集共花費了100秒,其中垃圾收集花費1秒,那吞吐量就是99%,
4.Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,同樣的單執行緒,區別在于基于“標記-整理演算法”實作,
5.Parallel Old收集器
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多執行緒并發收集,基于“標記-整理演算法”實作,
6.CMS收集器
CMS(Concurrent Mark Sweep)收集器是一款基于“標記-清除演算法”實作的,以獲取最短回收停頓時間(縮短STW時間)為目標的收集器,它的運作更加復雜,整個程序分為以下四步:
(1)初始標記:標記以下GC Roots能直接關聯到的物件,速度很快,需要"STW"
(2)并發標記:從GC Roots的直接關聯物件開始遍歷整個物件圖,速度比較慢,但是不需要"STW"
(3)重新標記:標記那些剛剛并發標記期間,可能被用戶重新拋棄的物件,速度比初始標記稍長,需要"STW"
(4)并發清除:清理被標記的已死亡的物件,由于不需要移動存活物件,所以可以并發執行,不需要"STW"
由于初始標記和重新標記的時間很短,因此CMS收集器可以理解為是記憶體回收的程序和用戶執行緒一起并發執行的,
7.Garbage First收集器
Garbage First(簡稱G1)收集器是一款具有“停頓時間模型”的收集器,而實作這一模型的關鍵是基于Region的堆記憶體布局,這款收集器就像T1(faker)一樣,很強,是當前介紹的幾款里最強的,
停頓時間模型的意思是能夠支持指定在一個長度為M毫秒的時間內,消耗在垃圾收集上的時間大概率不超過N毫秒這樣的目標,我們可以理解為:終于可以設定我想要的垃圾回收時間啦,
Region:將連續的Java堆劃分為多個大小相等的獨立區域,每一個區域都就是一個Region,它的不凡之處在于,每一個Region都可以根據需要扮演不同的角色:可以是Eden空間,可以是Survivor空間,也可以是老年代空間,值得一提的是Region中還有一類特殊的Humongous區域,專門用來存盤大物件(占一個Region大小容量一半的物件),而G1收集器一般把該區域的物件當做老年代來處理,

G1收集器的運作程序分為以下四步:
1.初始標記:標記一下GC Roots能直接關聯到的物件,需要短暫停頓,耗時很短,
2.并發標記:從GC Root 開始對堆中物件進行可達性分析,找到要回收的物件,耗時較長,但是和用戶執行緒并發執行,沒有"STW",當物件圖掃描完成后,還要重新處理剛剛并發時有參考變動的物件,
3.最終標記:對用戶執行緒做另外一個短暫的暫停,用于處理并發階段結束后仍然遺留下來的最后那少量的SATB記錄,
4.篩選回收:先更新Region的統計資料,對各個Region的回收價值和成本進行排序,根據用戶指定的時間(停頓時間模型在此處展現)來選擇要回收的多個Region,將這些Region中存活的物件復制到空的Region中,再清理掉整個舊的Region的全部空間,這里涉及移動存活的物件,所以需要暫停用戶執行緒,由多條收集器執行緒并行完成,
可見G1收集器除了并發標記以外,其他階段都需要暫停用戶執行緒,它并不是純粹地追求低延遲,而是在延遲可控的情況下獲得盡可能高的吞吐量,所以才擔得起“全功能收集器”的重任和期望,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/357096.html
標籤:java
