1、Serial/Serial Old收集器java
- 歷史最悠久的收集器
- 單線程的收集器
- 在工做時須要停掉虛擬機全部線程
- 優勢是在作事專注,動做迅速
- 在Client端的新生代中通常使用這個收集器回收,回收200M之內的新生代只須要不到100ms,這對於Client是能夠接受的
2、ParNew收集器算法
- Serial收集器的多線程版本
- 只有ParNew收集器能夠與CMS收集器配合使用
3、Parallel Scavenge收集器多線程
- 吞吐連優先的收集器
- 吞吐量:代碼運行時間/(代碼運行時間 + 垃圾收集時間)
4、CMS收集器併發
- 老年代併發收集器
- 基於 標記清除算法實現
- 執行垃圾收集時有四個步驟
- 初始標記(Stop the World):標記一下GC Root能直接關聯的對象,速度很快
- 併發標記:使用可達性分析算法,標記須要回收的對象
- 從新標記(Stop the World):標記 併發標記 期間變化的對象(多線程)
- 併發清除
- CMS優勢:併發收集、低停頓
- CMS缺點:
- 併發佔用CPU,致使用戶線程變慢
- 會產生浮動垃圾(併發清除時產生的垃圾),由於在併發清除時還用用戶線程在執行,因此要預留一部份內存,因此能夠經過參數設定當老年代內存被佔用 X% 時觸發CMS回收,若是回收失敗,會觸發Serial Old收集器,進行再一次回收
- CMS收集器是使用標記清除算法實現的,因此會殘生大量內存碎片,因此當CMS收集器觸發Serial Old時要進行內存整理操做(這個過程沒法併發,因此會致使程序變慢,能夠經過參數設定)
5、G1收集器線程
- G1收集器是注重停頓時間的收集器
- G1收集器能夠不須要其餘收集器配合,獨立管理新生代和老年代
- G1收集器將java堆分紅多個Region(新生代和老年代穿插在不一樣的Region裏,再也不物理隔離),兩個Region經過複製算法手機,總體看來經過標記整理算法手機,不會產生內存碎片
- 經過創建可預測的停頓時間模型,可讓使用者明確在M毫秒內的內存回收不超過N毫秒
- G1收集器,會根據停頓時間模型計算每一個Region回收的經驗值,根據能夠回收的時間(N毫秒)來回收最有回收價值的Region
- G1收集器經過Remebered Set記錄Region中對象有沒有被其餘Region中的對象引用(爲了不全堆掃描)
- G1收集器的過程:
- 初始標記(Stop the World):標記一下GC Root能直接關聯的對象,速度很快,與CMS不一樣的是,這個階段會修改TAMS值,讓 併發標記 階段產生的新對象都在正確可用的Region中建立
- 併發標記:經過可達性分析算法標記回收的對象
- 最終標記:修正在併發標記時改變的對象,並記錄到Remebered Set Logs中,而後虛擬機將Logs合併到Remebered Set中,這個過程是並行的(非併發)
- 篩選回收:根據Region的回收價值大小回收