前言:新生代的收集器有:Serial,ParNew,Parallel Scavenge等。老年代有:CMS,SerialOld,Paraller Old等。接下來將深刻理解各個垃圾收集器的原理,以及它們如何在不一樣場景下進行搭配使用。
同時,先解釋幾個名次: 算法
(1) ParNew
這是Serial收集器的多線程版本,使用多線程對垃圾收集,採用複製算法,同時須要暫時全部用戶線程。除了使用多線程其餘與Serial收集器相比並無什麼創新。可是爲何還要學習它,那是由於除了Serial收集器,目前只有它能與CMS收集器配合工做。所以咱們在Server中虛擬機首選項的新生代收集器仍是它。可使用的控制參數有:-XX:SurvivorRatio,-XX:PretenureSizeThreshold,-XX:HandlerPromotionFailure等(詳情見官方手冊)。多線程
(2) Parallel Scavenge收集器
使用複製算法,同時也是並行收集器,相比ParNew,它更關注於達到一個可控制的吞吐量。高吞吐量能夠高效率地利用CPU時間,儘快完成計算任務。因此這個收集器適合在後臺運算而不須要不少交互的任務。接下來看看兩個用於準備控制吞吐量的參數
1,-XX:MaxGCPauseMills(控制最大垃圾收集的時間)
設置一個大於0的毫秒數,收集器儘量地保證內存回收不超過設定值。可是並非設置地越小就越快。GC停頓時間縮短是以縮短吞吐量和新生代空間來換取的。
2,-XX:GCTimeRatio(設置吞吐量大小)
設置一個0-100的整數,也就是垃圾收集時間佔總時間的比率,至關於吞吐量的倒數。併發
(1) Serial Old
是Serial收集器的老年隊版本,也是一個單線程收集器,使用標記-整理算法。這個收集器主要在於給Client模式下的虛擬機使用。若是在Server中,主要用途是:1,在JDK1.5前和Parallel Scavenge搭配使用。2,做爲Concurrent Mode Failure時候使用。性能
(2)Parallel Old
這是Paraller Scanvenge收集器的老年隊收集器,使用標記-整理方式。在這個方式沒有產生以前,Parallel Scavenge只能選擇Serial Old。因爲被拖了後腿,那麼Parallel Scavenge並不能在總體上獲取吞吐量最大化的效果。甚至比不上CMS+ParNew的吞吐量。學習
(3)CMS收集器
這是一個以獲取最短回收停頓時間爲目標的併發收集器。對於重視服務響應時間,但願系統停頓時間儘量短的,那麼CMS就很是符合了。CMS收集器採用標記-清除實現。包括了四個步驟
1,初始標記:簡單標記下GC Roots能直接關聯到的對象,須要「Stop The World「
2,併發標記:進行GC Roots Tracing
3,從新標記:修正併發標記期間用戶程序繼續運行而致使標記發生變更那一部分對 象標記記錄,須要「Stop The World「
4,併發清除lua
缺點:
1,沒法處理浮動垃圾。因爲併發清理階段用戶線程還在運行,程序天然會有新的垃圾產生,那麼CMS將沒法在此次收集中處理掉它們。只能等待下次GC再清理。因爲垃圾回收階段用戶線程還須要運行。那麼就須要預留足夠的內存空間給用戶線程使用,因此CMS不能等待老年隊幾乎徹底快滿了再進行收集。須要預留一部分空間提供併發收集時候的程序使用。若是運行期間預留的內存沒法知足程序須要,那麼就會出現「Concurrent Mode Failure「,這時候就啓用Serial Old收集器進行老年代的收集。spa
2,對CPU資源敏感。在併發階段雖然不會致使用戶線程停頓,可是會由於佔用一部分線程(或者說CPU資源)而致使應用程序變慢,吞吐量下降,默認是啓動(CPU數量+3)/4的線程數。.net
3,會產生大量的空間碎片。CMS是基於標記-清除算法實現的,那麼收集結束時候會有大量空間碎片產生。這個時候就會給大對象分配帶來麻煩,由於沒法找到足夠大的連續空間來分配當前對象,不得不提早觸發一次Full GC。那麼咱們可使用:-XX:+UseCMSCompactAtFullCollection,在CMS收集器頂不住要進行FullGC時候開啓內存碎片的合併整理過程,可是會加長停頓時間。還有一個參數 -XX:CMSFullGCsBeforeCompaction,表示用於設置執行多少次不壓縮的Full GC後,跟着來一次帶壓縮的。線程
(1) 吞吐量優先的並行收集器
參數配置:
1, -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8
說明:選擇Parallel Scavenge收集器,而後配置多少個線程進行回收,最好與處理器數目相等。對象
2,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+UseParallelOldGC
說明:配置老年代使用Parallel Old
3,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100
說明:設置每次年輕代垃圾回收的最長時間。如何不能知足,那麼就會調全年輕代大小,知足這個設置
4,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100 -XX:+UseAdaptiveSizePolicy
說明:並行收集器會自動選擇年輕代區大小和Survivor區的比例。
(2)響應時間優先的併發收集器
1, -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
說明:設置老年代的收集器是CMS,年輕代是ParNew
2,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection 說明:首先設置運行多少次GC後對內存空間進行壓縮,整理。同時打開對年老代的壓縮(會影響性能)轉自:https://blog.csdn.net/KilluaZoldyck/article/details/75081875