(1)概述:Serial收集器的多線程版本,使用多線程進行垃圾收集。除多線程收集以外,其餘與Serial收集器相比沒有多大創新。
三、Parallel Scavenge收集器
(1)概述:一個新生代收集器,使用複製算法,並行的多線程收集器。
(2)目標:達到一個可控制的吞吐量。吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)。
四、CMS收集器
(1)概述:Concurrent Mark Sweep,基於「標記—清除」算法實現。整個過程分爲4個步驟:
a、初始標記
b、併發標記
c、從新標記
d、併發清除
其中,初始標記、從新標記仍然須要「S-T-W」。初始標記僅僅是標記一下GC Roots能直接關聯到的對象,速度很快,併發標記階段就是進行GC Roots Tracing 的過程,而從新標記階段是爲了修正併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分的標記記錄。
(2)目的:獲取最短回收停頓時間。
(3)優勢:併發收集、低停頓。
(4)缺點:a、CMS收集器對CPU資源很是敏感。在併發階段,它雖然不會致使用戶線程停頓,可是會由於佔用了一部分線程而致使應用程序變慢,總吞吐量下降。
b、CMS收集器沒法處理浮動垃圾。CMS併發處理階段用戶線程還運行着,伴隨程序運行還有垃圾產生過,這一部分垃圾出如今標記過程以後,CMS沒法再當次收集中處理掉。
c、「標記—清除」算法,收集結束時會產生大量空間碎片。
五、G1收集器
(1)概述:當今收集器計數發展最前沿成果之一,是一款面向服務端應用的垃圾收集器。運做步驟:
a、初始標記
b、併發標記
c、最終標記
d、篩選回收
(2)特色:a、並行與併發:G1能利用多CPU、多核環境下的硬件優點,使用多個CPU來縮短S-T-W停頓時間 b、分代收集
c、空間整合:總體上基於「標記—整理」算法,局部上看是「複製」算法實現的。運行期間不會產生內存空間碎片。
d、可預測的停頓。
(3)G1以前其餘收集器進行收集的範圍都是整個新生代或者老年代。使用g1收集器時,Java對內存佈局與其餘收集器有很大差異,將整個Java堆劃分爲多個大小相等的獨立區域(Region)。
G1有計劃地避免在整個Java堆中進行全區域的垃圾收集。G1跟蹤各個Region裏面的垃圾堆積的價值大小,在後臺維護一個優先列表,每次根據容許收集時間,優先回收價值最大的Region。
參考文獻
【1】《深刻理解Java虛擬機》 機械工業出版社 周志明