重學JVM之垃圾收集器

如下圖展示的是垃圾收集器的作用範圍是屬於新生代還是老年代,如果兩個垃圾收集器之間存在連線,則說明他們之間可以配合使用。
在這裏插入圖片描述
Serial
是一種單線程收集器
優點:簡單高效,擁有很高的單線程收集效率
缺點:收集過程需要暫停所有線程,即STW
算法:複製算法
適用範圍:新生代
Serial Old
Serial Old收集器是Serial收集器的老年代版本,也是一個單線程收集器,不同的是採用標記-整理算法,運行過程和Serial收集器一樣。

ParNew
可以理解爲Serial收集器的多線程版本。
優點:在多CPU時,比Serial效率高。
缺點:收集過程暫停所有應用程序線程,單CPU時比Serial效率差。
算法:複製算法
適用範圍:新生代

Parallel Scavenge

Parallel Scavenge收集器是一個新生代收集器,它也是使用複製算法的收集器,又是並行的多線程收集器,看上去和ParNew一樣,但是Parallel Scanvenge更關注系統的吞吐量。

Parallel Old

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多線程和標記-整理算法進行垃圾回收,也是更加關注系統的吞吐量

CMS
是一種以獲取最短回收停頓時間爲目標的收集器。
採用的是"標記-清除算法",整個過程分爲4步

(1)初始標記 CMS initial mark 標記GC Roots直接關聯對象,不用Tracing,速度很快 (2)併發標記
CMS concurrent mark 進行GC Roots Tracing (3)重新標記 CMS remark
修改併發標記因用戶程序變動的內容 (4)併發清除 CMS concurrent sweep
清除不可達對象回收空間,同時有新垃圾產生,留着下次清理稱爲浮動垃圾

由於整個過程中,併發標記和併發清除,收集器線程可以與用戶線程一起工作,CMS收集器的內存回收過程是與用戶線程一起併發地執行的。

優點:併發收集、低停頓
缺點:產生大量空間碎片、併發階段會降低吞吐量

G1
使用G1收集器時,Java堆的內存佈局與就與其他收集器有很大差別,它將整個Java堆劃分爲多個大小相等的獨立區域(Region)

工作過程可以分爲如下幾步

初始標記(Initial Marking) 標記以下GC Roots能夠關聯的對象,並且修改TAMS的值,需要暫停用戶線程
併發標記(Concurrent Marking) 從GC Roots進行可達性分析,找出存活的對象,與用戶線程併發執行
最終標記(Final Marking) 修正在併發標記階段因爲用戶程序的併發執行導致變動的數據,需暫停用戶線程
篩選回收(Live Data Counting and Evacuation)
對各個Region的回收價值和成本進行排序,根據用戶所期望的GC停頓時間制定回收計劃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章