JVM中垃圾的回收由垃圾收集器進行,隨着JDK的不斷升級,垃圾收集器也開發出了各類版本,垃圾收集器不斷優化的動力,就是爲了實現更短的停頓。java
下面是7種不一樣的分代收集器,若是兩個收集器之間有連線,則表示它們之間能夠搭配使用;所處的區域表示屬於新生代仍是老年代收集器。算法
1.Serial 收集器 (新生代)多線程
最基本、歷史最悠久(JDK1.3.1以前),這是一個單線程的收集器,當該收集器運行時必須暫停其餘全部的工做線程,直到它收集結束。併發
收集過程:暫停全部線程優化
算法:複製算法線程
優勢:簡單高效,擁有很高的單線程收集效率對象
應用:Client模式下的默認新生代收集器blog
2.ParNew 收集器 (新生代)排序
Serial 的多線程版本,使用多線程進行垃圾收集內存
收集過程:與用戶線程併發
算法:複製算法
優勢:在CPU多的狀況下,擁有比Serial更好的效果。單CPU環境下Serial效果更好
應用:許多運行在Server模式下的虛擬機中首選的新生代收集器
3.Parallel Scavenge 收集器(新生代)
Parallel Scavenge收集器的目標是達到一個可控制的吞吐量
吞吐量 = 運行用戶代碼時間 / (運行用戶代碼時間 + 垃圾收集時間)
控制吞吐量的參數:最大垃圾收集停頓時間 -XX:MaxGCPauseMillis ; 直接設置吞吐量大小:-XX:GCTimeRatio。
MaxGCPauseMillis 的值爲一個大於0的毫秒數, 最大停頓時間的縮短是以犧牲吞吐量和新生代空間來換取的。
GCTimeRatio 的值爲一個大於0且小於100的整數。例如:-XX:GCTimeRatio=9 咱們要求應用程序線程在整個執行時間中至少9/10是活動的(所以,GC線程佔用其他1/10)
-XX:+UseAdaptiveSizePolicy:開啓GC自適應調節策略,自動設置新生代大小、Eden與Survior區的比例、晉升老年代對象年齡等細節參數
應用:適合在後臺運算而不須要太多交互的任務
4.Serial Old 收集器 (老年代)
Serial收集器的老年代版本,也是一個單線程的收集器,使用標記-整理算法
收集過程:暫停全部線程
算法:標記-整理算法
應用:主要意義是Client模式下的收集器,若是在Server模式下還有:a. JDK1.5以前的版本中與Parallel Scavenge搭配使用,b. 做爲CMS收集器的後背預案在併發收集時使用
5. Parallel Old 收集器 (老年代)
Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」算法。
收集過程:多線程
算法:標記-整理算法
應用:在注重吞吐量及CPU資源敏感的場合,能夠優先考慮Parallel Scavenge加Parallel Old收集器
6. CMS 收集器 (老年代)
以獲取最短回收停頓時間爲目標,基於「標記-清除」算法
收集過程:初始標記-->併發標記-->從新標記-->併發清除
初始標記、從新標記兩個步驟仍須要「Stop The World」 : 初始標記僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快;併發標記就是進行GC Roots Tracing的過程;從新標記是爲了修正併發標記期間因用戶程序繼續運做,而致使標記產生變更的那一部分對象的標記記錄。
整個過程當中耗時最長的是併發標記和併發清除,這兩個過程均可以與用戶線程一塊兒工做。因此整體上說CMS收集器內存回收過程與用戶線程一塊兒併發執行。
算法:標記-清除 算法
缺點:1,對cpu資源敏感,默認啓動的回收線程數是(cpu數量+3)/4,當cpu數較少的時候,會分掉大部分的cpu去執行收集器線程,影響用戶,下降吞吐量。
2,沒法處理浮動垃圾,浮動垃圾即在併發清除階段由於是併發執行,還會產生垃圾,這一部分垃圾即爲浮動垃圾,要等下次收集。
3,由於使用的是「標記-清除」算法,會產生碎片。
7. G1收集器 (整個Java堆:包括新生代和老年代)
特色:並行與併發、分代收集、空間整合、可預測的停頓
G1將整個java堆(包括新生代和老生代)劃分爲多個大小固定的獨立區域,並跟蹤這些區域的垃圾堆積程度,在後臺維護一個優先列表,每次根據容許的收集時間,優先回收垃圾最多的區域。
但這樣回收有一個問題:對象分配在某個區域中,但並不是只被本區域的其餘對象引用,而是能夠與整個Java堆任意的對象發生引用關係。在作可達性分析的時候,如何避免掃描整個堆呢?
解決:區域之間的對象引用,以及其餘收集器中新生代與老年代之間的對象引用,虛擬機都是使用Remembered Set來避免全堆掃描,在Remembered Set中記錄對象的引用。
收集過程:初始標記-->併發標記-->最終標記-->篩選回收。與CMS不一樣的是,在最終標記階段,須要停頓線程,可是可併發執行;篩選回收階段,對各個區域的回收價值和成本進行排序,按照用戶所指望的回收時間進行垃圾回收,這個階段也能夠併發執行。