-
Serial收集器:僅僅使用一個線程去進行垃圾收集工做,且垃圾收集線程工做時,須要暫停用戶正常工做的線程,即STOP THE WORLD,適用於單CPU的場景,client模式下JVM默認新生代收集器;java
-
ParNew收集器:Serial收集器的多線程版,Server模式JVM新生代默認收集器,通常與CMS搭配使用;算法
-
Parallel Scanvenge收集器:多線程並行新生代收集器,與ParNew的區別在於此收集器更加關注對系統吞吐量的提高,吞吐量=用戶線程運行時間/系統運行總時間,比較適合用在CPU密集型的應用程序上;多線程
-
Serial Old收集器:Serial收集器的老年代版本,使用標記-整理算法,主要用於client模式下,能夠與Parallel Scanvenge收集器搭配使用;併發
-
Parallel Old收集器:Parallel Scanvenge的老年代版本,使用標記-整理算法,與Parallel Scanvenge搭配使用;線程
-
CMS收集器:以獲取最短回收停頓時間爲目標的收集器,使用標記-清除算法,每一個回收週期可總結爲如下六步:對象
- 初始標記:須要STW,但僅標記與GC ROOTS能直接關聯到的對象,所以耗時很短;
- 併發標記:不須要STW,使用一個或多個進程進行GC ROOTS Tracing,耗時較長;
- 再次併發標記:不須要STW,使用一個進程進行GC ROOTS tracing,彌補上個步驟執行時對象的變化;
- 從新標記:須要STW,主要是對併發標記期間程序運行對象發生變更的補充,停頓時間比初始標記稍長,但也遠短於併發標記;
- 併發清除:不須要STW,使用一個進程不可達對象進行回收,耗時較長;
- 重置:不須要STW,使用一個進程resize heap區域,併爲下次週期準備數據;
cms收集器有如下缺點:
- 對CPU資源敏感,因爲佔用了一部分線程資源會致使應用程序執行變慢,雖然使用增量式併發收集器(Incremental-CMS)解決線程獨佔的問題,讓收集線程和應用程序線程交替執行,但效果通常,且官文明確表示該模式會在將來版本中被移除;
- 沒法處理浮動垃圾(Floating Garbage),即在垃圾清理的過程當中,依然會有垃圾對象產生,這部分垃圾對象被稱爲浮動垃圾,所以CMS收集器須要在老年代爲應用程序預留足夠的空間備用,而不能等到老年代幾乎被塞滿後再執行,1.6中CMS的默認啓動閾值爲92%,當CMS運行時預留的內存沒法知足應用程序使用,會拋出"Concurrent Mode Failure",VM將啓用Serial Old收集器來從新進行老年代的垃圾收集
- 因爲使用的是標記-清理算法,所以會產生大量的空間碎片,當碎片過多沒法保存大對象時,就會觸發full GC,CMS提供了兩個參數,UseCMSCompactAtFullCollection和CMSFullGCsBeforeCompation,前者指定在full GC時進行碎片整理,後者指定每隔幾回full GC會進行一次碎片整理,默認值爲0;
-
G1收集器:官方最早進的垃圾收集技術,G1將java堆劃分爲多個大小相等的獨立區域(Region),雖然還保留新生代、老年代的概念,但再也不物理隔離,他們都是一部分Region(不須要連續)的集合具有以下特色:blog
- 並行與併發:充分利用多CPU的硬件優點,縮短STW時間;
- 分代收集:使用不一樣的方式收集新建對象、熬過屢次GC的舊對象獲取更好的收集效果;
- 空間整合:總體看來G1是基於標記-整理算法的,收集期間不會產生內存空間碎片;
- 可預測的停頓:G1能夠創建可預測的停頓時間模型,能讓使用者指定M毫秒內垃圾收集時間不超過N毫秒,G1在後臺維護一個有限列表跟蹤每一個Region的回收價值,每次根據容許的垃圾收集時間優先回收價值最大的Region;
G1須要解決的問題:
G1"化整爲零的"方式,給垃圾回收時的可達性分析帶來了麻煩,由於一個Region裏的對象可能和其餘全部Region中的對象有引用關係,爲了不全堆掃描,G1使用Remembered Set記錄對象的引用信息,在進行內存回收時加入Remembered Set便可不進行全堆掃描並不會有遺漏; G1的運行步驟:
- 初始標記:須要STW,標記GC Roots能直接關聯到的對象,並修改TAMS(Next Top at Mark Start)值,讓下一階段用戶程序運行時在正確的Region中建立對象;
- 併發標記:不須要STW,進行GC Tracing可達性分析,耗時較長;
- 最終標記:須要STW,對併發標記的遺漏進行補充,並將此期間內對象的變化記錄到Remembered Set Logs,併合併到Remembered Set中;
- 篩選回收:對各個Region的回收價值排序,根據用戶指望的GC停頓時間制定回收計劃,能夠與用戶程序併發執行,但停頓用戶線程會大幅提升回收效率;