JVM垃圾收集器介紹

  垃圾回收算法是GC的方法論,垃圾收集器就是內存回收的具體實現。算法

  1、Serial 收集器服務器

    單線程收集器,在進行GC時,必須暫停全部的工做線程(Stop The World),直到GC收集結束。多線程

    缺點:「Stop The World」給用戶帶來了很差的體驗併發

    優勢:簡單而高效,Serial沒有其餘線程交互的開銷,專心作GC能夠得到最高的單線程收集效率。spa

    適用於Client模式下的虛擬機是個很好的選擇。線程

  2、ParNew 收集器對象

     ParNew收集器就是Serial收集器的多線程版本,適用於Service模式下的新生代收集器。內存

     ParNew在單核CPU環境中絕對不會有比Serial收集器更好的效果。可是多核CPU,GC效果仍是不錯的。  ci

  3、Parallel Scavenge 收集器資源

    Parallel Scavenge 收集器也是一個新生代收集器,使用複製算法,同時也是一個並行的多線程收集器。

    Parallel Scavenge 收集器的目標則是達到一個可控制的吞吐量。

    注:吞吐量 =用戶運行代碼時間 / (運行代碼時間 + 垃圾收集時間)

    吞吐量高則能夠最高效率的利用CPU時間,儘快的完成程序的運算任務,主要適用於後臺運算二不須要太多的交互任務。

  4、Serial Old 收集器

    Serial Old 收集器是Serial收集器的老年代版本,單線程收集器,使用「標記-整理」算法。

  5、Parallel Old 收集器

    Parallel Old 收集器是Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」算法。

  6、CMS 收集器

    CMS(Concurrent Mark Sweep)收集器是一種以獲取最短停頓時間爲目標的收集器。目前很大一部分Java應用程序都集中是在互聯網或B/S系統的服務器上,這類應用尤爲重視服務器的響應速度,但願系統停頓時間最短,給用戶最好的體驗。整個過程分爲四步:

  • 初始標記(CMS initial mark):標記一下GC Root能直接關聯到的對象,速度很快;
  • 併發標記(CMS concurrent mark):進行GC Root Tracing的過程
  • 從新標記(CMS remark):修正併發標記期間,因用戶程序繼續運行致使標記產生變更的那一部分對象的標記記錄;
  • 併發清除(CMS concurrent sweep)  

  其中初始標記、從新標記仍是須要「Stop The World」.CMS收集器的內存回收過程與用戶線程併發執行。

  優勢是併發收集、低停頓

  缺點:1)CMS收集器對CPU資源很是敏感;在併發階段雖然不會致使用戶線程停頓,可是會由於佔用了一份線程而致使應用程序變慢,總吞吐量下降。

     2)CMS併發清除階段用戶線程還在運行,伴隨線程運行產生的新的垃圾出如今標記過程之後,CMS沒法在本次收集中處理掉它們,只能留到下次GC。這一部分垃圾就是「浮動垃圾」。

     3)CMS是一款「標記-清除」算法實現的收集器,收集過程會產生大量的空間碎片。空間碎片過多,將會給較大對象沒法分配內存,從而觸發一次 Full GC.

  7、G1 收集器

    G1(Garbage First)收集器相比於CMS改進有:

    (1)G1基於「標記-整理」算法實現收集器,即它不會產生大量的空間碎片,這對於長時間的應用系統很是重要。

    (2)能夠很是準確的控制停頓,既能讓使用者明確指定一個長度爲M毫秒的時間片斷內,消耗在垃圾收集上的時間不超過N毫秒。G1將Java堆(包括新生代、老年代)劃分爲多個大小固定獨立區域,而且跟蹤這些區域裏面的垃圾堆積程度,在後臺維護一個優先列表,每次根據容許的收集時間,優先回收垃圾最多的區域。

相關文章
相關標籤/搜索