下面給出基于JDK 1.7 Update 14之后的HotSpot虛擬機的所有收集器如下圖所示:
1.Serial收集器:
使用一個CPU或一條收集線程去完成垃圾收集工作槐雾,在進行垃圾收集的時候必須暫停其它所有的工作線程袍嬉,直到它收集結束杈曲。
特點:單線程,簡單高效,沒有多線程交互的開銷疏咐。
年代:新生;
算法:復制算法脐供。
2.ParNew收集器:
Serial收集器的多線程版本浑塞。
除了Serial收集器,目前只有ParNew收集器能與CMS收集器配合工作政己。
特點:多線程酌壕;
年代:新生、老年歇由;
算法:新生代-復制算法卵牍;老年代-標記-整理算法。
3.Parallel Scavenge收集器:
擁有自適應調節(jié)策略印蓖;
特點:并行辽慕,目標是達到一個可控制的吞吐量
年代:新生;
算法:復制算法赦肃。
4.Serial Old收集器:
Serial收集器的老年代版本溅蛉;
特點:單線程;
年代:老年代他宛;
算法:標記-整理船侧;
5.Parallel Old收集器:
Parallel Scavenge收集器的老年代版本;
特點:多線程厅各;
年代:老年代镜撩;
算法:標記-整理算法。
6.CMS收集器:
以獲取最短回收停頓時間為目標;
特點:并發(fā)收集袁梗、低停頓宜鸯;
年代:老年代;
算法:標記-清除算法遮怜;
運作過程:
(1)初始標記:(需要stop the world)標記GC Roots能直接關聯(lián)到的對象淋袖;
(2)并發(fā)標記:進行GC Roots Tracing的過程,耗時長锯梁;
(3)重新標記:(需要stop the world)修正并發(fā)標記期間因用戶程序繼續(xù)運作而導致標記產生變動的那一部分對象的標記記錄即碗;
(4)并發(fā)清除:耗時長;
缺點:
(1)對CPU資源非常敏感陌凳;
(2)無法處理浮動垃圾剥懒;(并發(fā)處理階段產生的垃圾)
(3)大量碎片產生;
7.G1收集器:
特點:
(1)并發(fā)與并行合敦;
(2)分代收集初橘;
(3)空間整合;
(4)可預測的停頓充岛;
年代:新生壁却,老年;
算法:從整體來看是基于“標記-整理”算法裸准,從局部(兩個Region之間)是基于“復制”算法實現(xiàn)展东;G1運作期間不會產生內存碎片。
G1收集器之所以能建立可預測的停頓時間模型炒俱,是因為它可以有計劃地避免在整個Java堆中進行全區(qū)域的垃圾收集盐肃。G1跟蹤各個Region里面的垃圾堆積的價值大小(回收所獲得的空間大小以及回收所需時間的經(jīng)驗值)权悟,在后臺維護一個優(yōu)先列表砸王,每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的Region峦阁。
步驟:
(1)初始標記:標記GC Roots能直接關聯(lián)到的對象谦铃,并且修改TAMS(Next Top at Next Start)的值,讓下一階段用戶程序并發(fā)運行時榔昔,能在正確可用的Region中創(chuàng)建新的對象驹闰;需要停頓線程,但耗時短撒会;
(2)并發(fā)標記:從GC Roots開始對堆中對象進行可達性分析嘹朗,找出存活對象;耗時長诵肛,可并發(fā)執(zhí)行屹培;
(3)最終標記:修正上一階段因用戶線程運作而導致標記產生變動的那一部分的記錄,記錄在線程Remembered Set Log里面,最終把數(shù)據(jù)整合到Remembered Set中褪秀;需要停頓線程蓄诽,但可并行執(zhí)行;
(4)篩選回收:首先對各個Region中的回收價值和成本進行排序媒吗,根據(jù)用戶所期望的GC停頓時間來制定回收計劃若专;并發(fā)執(zhí)行。