收集器 | 適用區域 | 特點 | 適用場景 |
---|---|---|---|
Serial | 新生代 | 單線程,STW(Stop-The-World) | 客戶端小應用 |
Parallel Scavenge | 新生代 | 多線程,吞吐量優先 | 后臺計算任務 |
ParNew | 新生代 | Serial 的多線程版 | 配合 CMS 使用 |
CMS | 老年代 | 并發標記,低延遲 | 響應優先的系統 |
G1 | 全堆 | 分區域回收,平衡吞吐/延遲 | JDK9+ 默認 |
ZGC | 全堆 | 超低延遲(<10ms) | 超大堆應用 |
1. Serial 收集器
-
特點:單線程、STW(Stop-The-World)
-
區域:新生代(復制算法)
-
適用場景:客戶端模式(如
-client
)、單核CPU -
參數:
-XX:+UseSerialGC
總結:簡單高效,但停頓時間長。
2. ParNew 收集器
-
特點:Serial 的多線程版本
-
區域:新生代(復制算法)
-
適用場景:配合CMS使用(JDK8及之前)
-
參數:
-XX:+UseParNewGC
總結:多線程提升GC效率,但仍有STW。
3. Parallel Scavenge(吞吐量優先)
-
特點:多線程、關注吞吐量(
吞吐量 = 用戶代碼時間 / (用戶代碼時間 + GC時間)
) -
區域:新生代(復制算法)
-
適用場景:后臺計算型任務(如批量處理)
-
參數:
-XX:+UseParallelGC
總結:適合不關心延遲,追求高吞吐的場景。
4. Serial Old 收集器
-
特點:Serial 的老年代版本
-
區域:老年代(標記-整理算法)
-
適用場景:與Parallel Scavenge搭配或作為CMS后備
-
參數:
-XX:+UseSerialOldGC
(JDK9已移除)
5. Parallel Old 收集器
-
特點:Parallel Scavenge 的老年代版本
-
區域:老年代(標記-整理算法)
-
適用場景:與Parallel Scavenge組合,吞吐量優先
-
參數:
-XX:+UseParallelOldGC
總結:JDK8默認組合(Parallel Scavenge + Parallel Old)。
6. CMS(Concurrent Mark-Sweep)
-
特點:并發標記清除、低延遲
-
區域:老年代(標記-清除算法)
-
流程:
-
初始標記(STW)
-
并發標記
-
重新標記(STW)
-
并發清除
-
-
缺點:內存碎片、并發模式失敗(Concurrent Mode Failure)
-
參數:
-XX:+UseConcMarkSweepGC
(JDK14已移除)
總結:減少停頓時間,但內存碎片和CPU敏感。
7. G1(Garbage-First)
-
特點:分區域(Region)收集、可預測停頓模型
-
區域:全堆(標記-整理算法)
-
流程:
-
初始標記(STW)
-
并發標記
-
最終標記(STW)
-
篩選回收(STW)
-
-
優勢:平衡吞吐和延遲,適合大堆(JDK9+默認)
-
參數:
-XX:+UseG1GC
總結:現代JVM首選,適合6GB以上堆內存。
8. ZGC(低延遲)
-
特點:并發回收、停頓時間<10ms
-
區域:全堆(染色指針+讀屏障)
-
適用場景:超大堆(TB級)、對延遲敏感
-
參數:
-XX:+UseZGC
(JDK15+生產可用)
總結:未來趨勢,但需要較新JDK版本。
9. Shenandoah
-
特點:類似ZGC,但開源實現
-
優勢:低停頓(與ZGC競爭)
-
參數:
-XX:+UseShenandoahGC
對比總結
收集器 | 目標 | 算法 | 適用場景 |
---|---|---|---|
Serial/Serial Old | 簡單 | 復制/標記-整理 | 單核、客戶端 |
Parallel Scavenge | 高吞吐 | 復制/標記-整理 | 后臺計算 |
CMS | 低延遲 | 標記-清除 | 老年代(JDK8及之前) |
G1 | 平衡 | 標記-整理 | JDK9+默認,大堆 |
ZGC/Shenandoah | 超低延遲 | 染色指針 | 超大堆、敏感應用 |