七種垃圾收集器的對比總結

     如果說收集算法是內存回收的方法論,那麼垃圾收集器就是內存回收的具體實現

上一篇博客總結了四種垃圾收集算法,這次就來總結一下七種不同的垃圾收集器。(概述、特點、應用場景、參數設置)

在這裏插入圖片描述
注:連線表示兩個收集器可以搭配使用;
      上半部分爲新生代,下半部分爲老年代;

首先解釋一下兩個名詞:

  • 並行(Parallel):指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態;(如 ParNewParallel ScavengeParallel Old
  • 併發(Concurrent):指用戶線程與垃圾收集線程同時執行(但不一定是並行的,可能會交替執行),用戶程序在繼續運行,而垃圾收集程序線程運行於另一個CPU上;(如 CMSG1

1、Serial收集器

2、ParNew收集器

3、Parallel Scavenge收集器

4、Serial Old收集器

5、Parallel Old收集器

6、CMS(Concurrent Mark Sweep)收集器

7、G1(Garbage-First)收集器

8、IDEA中設置虛擬機參數的方法

1、Serial收集器

  • 是最基本、發展歷史最悠久的收集器;
  • JDK1.3.1前是HotSpot新生代收集的唯一選擇;
  • 老年代版本:Serial Old

在這裏插入圖片描述

特點:
  1. 單線程;
    (不僅只會使用一個CPU或一條線程去完成GC(Garbage Collection,垃圾收集),更重要的時在GC時,必須暫停其他所有的工作線程,直到它收集結束(Stop The World))
  2. 簡單而高效
    (因爲對於限定單個CPU來說,沒有線程交互的開銷)
  3. 算法:複製算法
  4. 使用區域:新生代(可與 運行於老年代的Serial Old 搭配使用)
應用場景:
  1. 運行於client模式下的虛擬機
  2. 對於限定單個CPU的環境來說,Serial收集器沒有線程交互(切換)開銷,可以獲得最高的單線程收集效率
  3. 在用戶的桌面應用場景中,可用內存一般不大(幾十M至一兩百M),可以在較短時間內完成垃圾收集(幾十MS至一百多MS),只要不頻繁發生,這是可以接受的
設置參數:

idea中設置參數的方法

顯式使用串行垃圾收集器
"-XX:+UseSerialGC"

2、ParNew收集器

  • ParNew收集器其實就是Serial收集器的多線程版本
    在這裏插入圖片描述
特點:

1.並行的多線程收集器;
2. 除了多線程,其餘行爲包括Serial收集器可用的所有控制參數、收集算法、Stop The World、對象分配策略、回收策略等都與Serial收集器完全一樣
3. 除了Serial以外,目前只有它能與 CMS收集器 配合工作
4. 算法:複製算法
5. 使用區域:新生代

應用場景:
  1. 運行在Server模式下的虛擬機的首選
設置參數:
指定使用CMS後,會默認使用ParNew作爲新生代收集:
"-XX:+UseConcMarkSweepGC"
強制指定使用ParNew:   
"-XX:+UseParNewGC"
限制垃圾收集的線程數量,ParNew默認開啓的收集線程與CPU的數量相同:
"-XX:ParallelGCThreads"

3、Parallel Scavenge收集器

  • 其他收集器的關注點是儘可能地縮短GC時用戶線程的停頓時間,而Parallel Scavenge收集器的目標是達到一個可控制的吞吐量(Throughput)。
    該收集器也經常被稱爲“吞吐量優先”收集器。
  • 老年代版本:Parallel Old收集器
    在這裏插入圖片描述
特點:
  1. 並行的多線程收集器;
  2. 以達到一個可控制的吞吐量爲目的;
  3. 擁有自適應調節策略;
  4. 算法:複製算法
  5. 使用區域:新生代
應用場景
  1. 以高吞吐量爲目標的虛擬機;
  2. 適合在後臺運算而不需要太多交互的任務;
  3. 對收集器運作不瞭解,手工優化存在困難時,可使用Parallel Scavenge收集器配合自適應調節策略
設置參數:
控制最大垃圾收集停頓時間:
"-XX:MaxGCPauseMillis"
設置吞吐量大小:
"-XX:GCTimeRatio"
打開GC自適應調節策略:(不需要手工指定新生代大小(-Xmn)、Eden與Survivor區的比例(-XX:SurvivorRatio)、晉升老年代對象年齡(-XX:PretenureSizeThreshold)等參數細節)
"-XX:+UseAdaptiveSizePolicy"

4、Serial Old收集器

  • Serial Old是Serial收集器的老年代版本
    在這裏插入圖片描述
特點:
  1. 單線程;(Stop The World)
  2. 算法:“標記-整理”算法
  3. 使用區域:老年代
應用場景:
  1. Client模式下的虛擬機;
  2. Server模式下,在JDK1.5及之前的版本中與Paralled Scavenge收集器搭配使用;
  3. Server模式下,作爲 CMS收集器 的後備預案,在併發收集發生Concurrent Mode Failure時使用

5、Parallel Old收集器

特點:
  1. 並行的多線程收集器;
  2. 算法:“標記-整理”算法
  3. 使用區域:老年代(可與 Parallel Scavenge收集器 搭配使用)
應用場景:
  1. 注重吞吐量優先以及CPU資源敏感的場合,優先考慮Parallel Scavenge加Parallel Old收集器
設置參數:
指定使用Parallel Old收集器:
"-XX:+UseParallelOldGC"

6、CMS收集器

  • 也被稱爲“併發低停頓收集器(Concurrent Low Pause Collector)”
  • 運作相對前面幾種收集器來說更復雜一下,整個過程分爲4個步驟:
    初始標記(CMS initial mark)
    併發標記(CMS concurrent mark)
    重新標記(CMS remark)
    併發清除(CMS concurrent sweep)

其中,初始標記和重新標記仍需Stop-The-World
在這裏插入圖片描述

特點:
  1. 以獲取最短回收停頓時間爲目標;
  2. 併發收集器;
  3. 對CPU資源非常敏感;
  4. 無法處理浮動垃圾,可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生。
  5. 產生大量的空間碎片(設置參數可以解決
  6. 算法:“標記-清除”算法
  7. 使用區域:老年代
應用場景:
  1. 集中在互聯網站或者B/S系統的服務器端上的應用;(即重視服務響應速度的應用)
設置參數:
指定使用CMS收集器
"-XX:+UseConcMarkSweepGC"
空間碎片的解決方法:
"-XX:+UseCMSCompactAtFullCollection"
使得CMS出現上面這種情況時不進行Full GC,而開啓內存碎片的合併整理過程;
但合併整理過程無法併發,停頓時間會變長;
默認開啓(但不會進行,結合下面的CMSFullGCsBeforeCompaction);

"-XX:+CMSFullGCsBeforeCompaction"
設置執行多少次不壓縮的Full GC後,來一次壓縮整理;
爲減少合併整理過程的停頓時間;
默認爲0,也就是說每次都執行Full GC,不會進行壓縮整理;

7、G1收集器

  • G1(Garbage-First)收集器是當今收集器技術發展的最前沿成果之一
  • 是一款面向服務端應用的垃圾收集器
    在這裏插入圖片描述
特點:
  1. 並行與併發
  2. 分代收集
  3. 空間整合(不會產生空間碎片,能提供規整的可用內存)
  4. 可預測的停頓
  5. 算法:**從整體上看,基於“標記-整理”算法;從局部(兩個region之間)上看,基於“複製”算法**
  6. 使用區域:新生代和老年代
應用場景:
  1. 追求低停頓,並具有大堆的應用程序;
  2. 面向服務端應用,針對具有大內存、多處理器的機器;
設置參數:
指定使用G1收集器:
"-XX:+UseG1GC"

當整個Java堆的佔用率達到參數值時,開始併發標記階段;默認爲45"-XX:InitiatingHeapOccupancyPercent"

爲G1設置暫停時間目標,默認值爲200毫秒:
"-XX:MaxGCPauseMillis"

設置每個Region大小,範圍1MB到32MB;目標是在最小Java堆時可以擁有約2048個Region:
"-XX:G1HeapRegionSize"

新生代最小值,默認值5%:
"-XX:G1NewSizePercent"

新生代最大值,默認值60%:
"-XX:G1MaxNewSizePercent"

設置STW期間,並行GC線程數:
"-XX:ParallelGCThreads"

設置併發標記階段,並行執行的線程數:
"-XX:ConcGCThreads"

8、IDEA中設置虛擬機參數的方法

選擇“Edit Configurations…”,打開“Run/Debug Configurations”頁面
在這裏插入圖片描述
在"VM options"中直接輸入參數
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章