天天看點

GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解

GC之7大垃圾收集器詳解

目錄

  1. GC之7大垃圾收集器概述
  2. GC之Serial收集器
  3. GC之ParNew收集器
  4. GC之Parallel收集器
  5. GC之ParallelOld收集器
  6. GC之CMS收集器
  7. GC之SerialOld收集器
  8. GC之如何選擇垃圾收集器
  9. GC之G1收集器

1. GC之7大垃圾收集器概述

  1. 垃圾收集器具體實作GC算法并實作記憶體回收。不同廠商,不同版本的虛拟機實作差别很大,HotSpot中包含的收集器如下圖所示:
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  2. 部分參數說明,下面會見到。
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  3. 小擴充:Server/Client模式分别是什麼意思
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解

2. GC之Serial收集器

  1. 串行收集器:Serial收集器,一個單線程收集器,在進行垃圾收集時候,必須暫停其他所有的工作線程直到它收集結束
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  2. 串行收集器是最古老,最穩定以及效率高的收集器,隻使用一個線程去回收但其在進行垃圾收集過程中可能會産生較長的停頓(Stop-The-world狀态)。雖然在收集垃圾過程中需要暫停所有其他的工作線程,但是它簡單高效,對于限定單個CPU環境來說,沒有線程互動的開銷可以獲得最高的單線程垃圾收集效率,是以Serial垃圾收集器依然是Java虛拟機運作在Client模式下預設的新生代垃圾收集器。
  3. 對應JVM參數是:-XX:+UseSerialGC

    開啟後會使用:Serial(young區用)+SerialOld(Old區用)的收集器組合(參考圖一)

    表示:新生代、老年代都會使用串行回收收集器,新生代使用複制算法,老年代使用标記-整理算法

3. GC之ParNew收集器

  1. ParNew(并行)收集器:使用多線程進行垃圾回收,在垃圾收集時,會Stop-the-World暫停其他所有的工作線程直到它收集結束。
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  2. ParNew收集器其實就是Seria收集器新生代的并行多線程版本,最常見的應用場景是配合老年代的CMS GC工作,其餘的行為和Serial收集器完全一樣,ParNew垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程。它是很多Java虛拟機運作在Server模式下新生代的預設垃圾收集器。
  3. 常用對應JVM參數:-XX:+UseParNewGC,啟用ParNew收集器,隻影響新生代的收集,不影響老年代
  4. 開啟上述參數後,會使用:ParNew(Young區用)+SerialOld的收集器組合,新生代使用複制算法,老年代采用标記-整理算法
  5. 但是,ParNew+Tenured這樣的搭配,java8已經不再推薦:
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  6. -XX:ParallelGCThreads 限制線程數量,預設開啟和CPU數目相同的線程數。

4. GC之Parallel收集器

  1. Parallel Scavenge收集器類似ParNew也是一個新生代垃圾收集器,使用複制算法,也是一個并行的多線程的垃圾收集器,俗稱吞吐量優先收集器。一句話:串行收集器在新生代和老年代的并行化
    GC之7大垃圾收集器詳解(上)GC之7大垃圾收集器詳解
  2. 它重點關注的是:可控制的吞吐量〈Thoughput=運作使用者代碼時間/(運作使用者代碼時間+垃圾收集時間),也即比如程式運作100分鐘,垃圾收集時間1分鐘,吞吐量就是99%)。高吞吐量意味着高效利用CPU的時間,它多用于在背景運算而不需要太多互動的任務。
  3. 自适應調節政策也是ParallelScavenge收集器與ParNew收集器的一個重要差別。(自适應調節政策:虛拟機會根據目前系統的運作情況收集性能監控資訊,動态調整這些參數以提供最合适的停頓時間(-XX:MaxGCPauseMillis)或最大的吞吐量。
  4. 常用JVM參數:-XX:+UseParaIIeIGC或-XX:+UseParaIIeIOldGC(可互相激活)使用ParallelScanvenge收集器開啟該參數後:新生代使用複制算法,老年代使用标記·整理算法
  5. 補充:

    -XX:ParaIIeIGCThreads=數字N,表示啟動多少個GC線程

    cpu>8,N=5/8

    cpu<8,N=實際個數

5. GC之ParallelOld收集器

  1. ParallelOld收集器是ParaScavenge的老年代版本,使用多線程的标記-整理算法,Parallel Old收集器在JDKI.6才開始提供。
  2. 在JDK1.6之前,新生代使用ParallelScavenge收集器隻能搭配年老代的SerialOld收集器,隻能保證新生代的吞吐量優先,無法保證整體的吞吐量。
  3. ParallelOld正是為了在年老代同樣提供吞吐量優先的垃圾收集器,如果系統對吞吐量要求比較高,JDK1.8後可以優先考慮新生代ParallelScavenge和年老代Parallel Old收集器的搭配政策。在JDK1.8及後(Parallel Scavenge+Parallel Old)
  4. JVM常用參數:

    -XX:+UseParallelOldGC使用ParallelOld收集器,設定該參數後,新生代Parallel+老年代ParallelOld

6. GC之CMS收集器

GC之CMS收集器和目錄下的内容,篇幅限制,放在另一篇部落格具體講:GC之7大垃圾收集器詳解(下)