Java虛擬機-垃圾回收器
新生代垃圾收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
新生代和老年代都能回收的收集器:G1

Serial收集器
Serial收集器是一個單線程工作的收集器,在它進行垃圾回收工作時,必須暫停其他所有工作線程(Stop The World),直到收集結(jié)束。
對于內(nèi)存資源受限的環(huán)境,Serial是所有收集器中消耗額外內(nèi)存最小的。
在單核處理器或者處理器核心較少的環(huán)境,Serial由于沒有線程交互的開銷,可以獲得最高的單線程收集效率。
ParNew收集器
ParNew收集器實質(zhì)上是Serial收集器的多線程版本,ParNew的多線程指的是垃圾回收時進行多線程的回收,并不能和用戶線程一起工作,依然需要Stop The World。
Parallel Scavenge收集器
Parallel Scavenge是基于“標記-整理算法”實現(xiàn)的垃圾收集器,也能夠進行并行收集的多線程收集器。
Parallel Scavenge收集器關(guān)注的是達到一個可以控制的吞吐量。
吞吐量=運行用戶代碼時間 /(運行用戶代碼時間+運行垃圾收集的時間)
Serial Old收集器
Serial Old收集器是Serial的老年代版本,它同樣是一個單線程收集器,使用“標記-整理算法”。
在服務(wù)端模式下,他的兩個用途:
在Jdk5版本之前中Serial Old和Parallel Scavenge配合使用。
在CMS收集器發(fā)生失敗后(并發(fā)收集出現(xiàn)Concurrent Mode Failure時)使用。
Parallel Old收集器
Parallel Old收集器時Parallel Scavenge的老年代版本,支持多線程并發(fā)收集,基于“標記-整理算法”實現(xiàn)。
CMS(Concurrent Mark Sweep)收集器
CMS收集器以獲取最短停頓時間為目標,是基于“標記-清除”算法實現(xiàn)的。收集過程分為四個步驟:
初始標記:需要暫停用戶進程,工作是標記GC Roots能直接關(guān)聯(lián)的對象。
并發(fā)標記:從GC Roots直接關(guān)聯(lián)的對象開始遍歷對象圖。(與用戶進程并發(fā)運行)
重新標記:需要暫停用戶進程,為了修正并發(fā)標記期間,用戶程序運行導致標記產(chǎn)生變動的對象的標記記錄。
并發(fā)清除:清理掉被標記階段判斷已經(jīng)“死亡”的對象。(與用戶進程并發(fā)運行)
CMS收集器的缺點:
面向并發(fā)設(shè)計的程序都對處理器資源比較敏感。在并發(fā)階段CMS雖然不會導致用戶進程停頓,但是會消耗一部分線程資源,導致應用程序變慢,吞吐量降低。
CMS收集器無法處理“浮動垃圾”,有可能會出現(xiàn)“Concurrent Mode Failure”而導致“Full GC”的發(fā)生。
CMS是一款基于“標記-清除算法”的收集器,收集結(jié)束會產(chǎn)生大量的空間碎片。在空間碎片過多時,會對大對象分配帶來很大的麻煩,無法分配足夠大的連續(xù)空間時,不得不提前觸發(fā)“Full GC”
浮動垃圾是指CMS收集器在并發(fā)標記和清除階段,用戶程序產(chǎn)生的垃圾,CMS收集器無法在當次垃圾收集中處理掉它們。
G1(Garbage First)收集器
G1收集器開創(chuàng)了收集器面向局部收集的思路和基于Region的內(nèi)存布局。
Region中還有一類特殊的Humongous區(qū)域,專門用來存放大對象(大小超過Region的一半)。
G1仍然保留了新生代和老年代的概念,但是新生代和老年代不是固定的,它們都是一系列區(qū)域的動態(tài)集合。
G1可以面對堆內(nèi)存中的任何部分進行回收,衡量保準不是內(nèi)存屬于哪一個分代,而是哪塊內(nèi)存中存放的垃圾最多,回收收益最大,這就是G1的Mixed GC模式。
G1收集器的運作過程:
初始標記:標記GC Roots能直接關(guān)聯(lián)到的對象,并修改TAMS指針的值,讓下一階段用戶進程并發(fā)運行時能在可用的Region中分配對象。
并發(fā)標記:從GC Roots直接關(guān)聯(lián)的對象開始,對堆中對象進行可達性分析,找出要回收的對象。
最終標記:暫停用戶線程,處理并發(fā)階段結(jié)束后仍然遺留下來的最后少量的SATB記錄。
篩選回收:負責更新Region的統(tǒng)計數(shù)據(jù),對Region的回收價值和成本進行排序,根據(jù)用戶期望停頓時間來制定回收計劃,把存活的對象復制到空Region中,然后清空這個舊Region。
與CMS比較:
G1從整體角度上看是使用的“標記-整理算法”,從Region的角度看使用的是“標記-復制算法”。不會產(chǎn)生空間碎片。
G1為了垃圾收集產(chǎn)生的垃圾占用和程序運行時的額外負載都比CMS高。