若是說收集算法是內存回收的方法論,那麼垃圾收集器就是內存回收的具體實現。如今爲止尚未最好的垃圾收集器出現,更加沒有萬能的垃圾收集器,咱們能作的就是根據具體應用場景選擇適合本身的垃圾收集器。HotSpot虛擬機中的7個垃圾收集器以下所示:java
若是兩個收集器存在連線,說明能夠搭配使用。所處的區域表示屬於新生代仍是老年代收集器。新生代採用複製算法,老年代採用標記-整理算法。git
它的優勢是簡單高效,對於單個 CPU 環境來講,因爲沒有線程交互的開銷,所以擁有最高的單線程收集效率。github
它是Client模式下的默認新生代收集器,由於在該應用場景下,分配給虛擬機管理的內存通常來講不會很大。Serial 收集器收集幾十兆甚至一兩百兆的新生代停頓時間能夠控制在一百多毫秒之內,只要不是太頻繁,這點停頓是能夠接受的。算法
新生代採用複製算法,老年代採用標記-整理算法。服務器
是Server模式下的虛擬機首選新生代收集器,除了性能緣由外,主要是由於除了 Serial 收集器,只有它能與 CMS 收集器配合工做。多線程
在單CPU的環境中不會有比Serial收集器更好的效果。可是隨着使用的CPU的數量的增長,對於GC時系統資源的有效利用是有好處的。默認開啓的線程數量與 CPU 數量相同,可使用 -XX:ParallelGCThreads 參數來設置線程數。閉包
並行:多條垃圾收集線程並行工做,單此時用戶線程仍然處於等待狀態。併發
併發:用戶線程與垃圾收集線程同時執行,不必定是並行的。用戶程序在繼續運行,GC程序運行在另一個CPU上。jvm
相似於ParNew收集器,是一個並行的多線程收集器、新生代收集器,使用複製算法。性能
其它收集器關注點是儘量縮短垃圾收集時用戶線程的停頓時間,而它的目標是達到一個可控制的吞吐量,它被稱爲「吞吐量優先」收集器。這裏的吞吐量指 CPU 用於運行用戶代碼的時間佔總時間的比值。
停頓時間越短就越適合須要與用戶交互的程序,良好的響應速度能提高用戶體驗。而高吞吐量則能夠高效率地利用 CPU 時間,儘快完成程序的運算任務,適合在後臺運算而不須要太多交互的任務。
縮短停頓時間是以犧牲吞吐量和新生代空間來換取的:新生代空間變小,垃圾回收變得頻繁,致使吞吐量降低。
Serial收集器的老年代版本,它一樣是一個單線程收集器。它主要有兩大用途:一種用途是在JDK1.5以及之前的版本中與Parallel Scavenge收集器搭配使用,另外一種用途是做爲CMS收集器的後備方案,在併發收集發生 Concurrent Mode Failure 時使用。
是 Parallel Scavenge 收集器的老年代版本,使用多線程和「標記-整理」算法。
在注重吞吐量以及 CPU 資源敏感的場合,均可以優先考慮 Parallel Scavenge 加 Parallel Old 收集器。
是一種以獲取最短回收停頓時間爲目標的收集器。於是很是符合在注重用戶體驗的應用上使用。
是HotSpot虛擬機第一款真正意義上的併發收集器,它第一次實現了讓垃圾收集線程與用戶線程(基本上)同時工做。
分爲如下四個流程:
主要優勢:併發收集、低停頓
具備如下三個缺點:
G1 (Garbage-First)是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器,在多 CPU 和大內存的場景下有很好的性能,以極高機率知足GC停頓時間要求的同時,還具有高吞吐量性能特徵,被視爲JDK1.7中HotSpot虛擬機的一個重要進化特徵。HotSpot 開發團隊賦予它的使命是將來能夠替換掉 CMS 收集器。
具備如下特色:
其它收集器進行收集的範圍都是整個新生代或者老年代,而 G1 能夠直接對新生代和老年代一塊兒回收。
G1 把堆劃分紅多個大小相等的獨立區域(Region),新生代和老年代再也不物理隔離。 經過引入 Region 的概念,從而將原來的一整塊內存空間劃分紅多個的小空間,使得每一個小空間能夠單獨進行垃圾回收。這種劃分方法帶來了很大的靈活性,使得可預測的停頓時間模型成爲可能。經過記錄每一個Region垃圾回收時間以及回收所得到的空間(這兩個值是經過過去回收的經驗得到),並維護一個優先列表,每次根據容許的收集時間,優先回收價值最大的 Region。每一個 Region 都有一個 Remembered Set,用來記錄該 Region 對象的引用對象所在的 Region。經過使用 Remembered Set,在作可達性分析的時候就能夠避免全堆掃描。
若是不計算維護 Remembered Set 的操做,G1 收集器的運做大體可劃分爲如下幾個步驟:參考資料