1. 程式人生 > >【理解HotSpot虛擬機器】GC垃圾收集器的對比分析

【理解HotSpot虛擬機器】GC垃圾收集器的對比分析

1 概述

目前,JVM中有四種類型的垃圾收集器。一開始接觸HotSpot的垃圾收集器,很容易被許多的名字混淆,《深入理解Java虛擬機器》中給每種垃圾收集起了名字(下表第二列),對應在HotSpot中的實現類(下表第三列)

型別 名稱 jvm的實現類
1 序列垃圾收集器 Serial收集器 def new generation 新生代
1 序列垃圾收集器 Serial Old收集器 tenured generation 老年代
2 並行垃圾收集器 ParNew收集器 par new generation 新生代
2 並行垃圾收集器 Parallel Scavenge收集器 PSYoungGen 新生代
2 並行垃圾收集器 Parallel Old收集器 ParOldGen 老年代
3 併發標記掃描垃圾收集器 CMS收集器 concurrent mark-sweep generation 老年代
4 G1垃圾收集器 G1收集器 garbage-first heap 均可

每種型別的垃圾收集器有它的特點,以及使用範圍,下面逐一介紹。

2 序列垃圾回收器



序列垃圾收集器GC示意圖

序列垃圾回收器有兩個:

  • Serial收集器:新生代,複製演算法
  • Serial Old收集器:老年代,標記-整理演算法

優點:

  • 實現簡單
  • 適用於簡單的命令列程式和Client模式

缺點:

  • Stop the world 時間較長

3 並行垃圾收集器



並行垃圾收集器GC示意圖

並行垃圾回收器有三個:

  • ParNew收集器:新生代,複製演算法,跟Serial收集器基本一樣,只是多執行緒版本,CMS收集器最佳搭配
  • Parallel Scavenge收集器:新生代,複製演算法,基於吞吐量優化,具備自適應調節策略
  • Parallel Old收集器:老年代,標記-整理演算法,基於吞吐量優化

優點:

  • 在多CPU環境下,比Serial收集器要高效
  • Parallel Scavenge收集器和Parallel Old收集器高效率利用CPU時間,適用於後臺運算,少互動情況

缺點:

  • 仍存在Stop the world 時間較長問題,不能併發GC

4 併發標記掃描垃圾收集器



CMS收集器GC示意圖

CMS是基於最短停頓時間,應用於老年代,標記-清除演算法的收集器,包括4個步驟:

  • 初始標記:僅標記GC Root能直接關聯到的物件
  • 併發標記:進行GC Root Trancing
  • 重新標記:修正併發標記期間,因使用者程式執行導致的標記變動的那部分物件的標記記錄
  • 併發清除:清除物件

優點:

  • 大部分時間可與使用者執行緒併發執行,停頓時間小

缺點:

  • CMS收集器非常佔用CPU資源
  • 無法處理在併發清除期間新出現的垃圾(浮動垃圾)
  • 基於標記-清除演算法,會產生許多碎片

5 G1垃圾收集器



G1收集器GC示意圖

G1的垃圾收集過程與CMS十分相似。主要不同在於G1將整個Java堆劃分為多個大小相等的獨立區域(Region),新生代和老年代不再是物理上連續的,而是邏輯上連續的。

優點:

  • 同時實現了並行與併發,並行指多個執行緒同時進行。併發指能與使用者執行緒同時進行
  • 空間整合:整體看是“標記-整理“演算法,區域性看是“複製“演算法
  • 可預測停頓時間

缺點:

  • 實現複雜

6 總結

新生代、老年代的垃圾收集器有許多,常見的搭配有一下四種:

JVM引數 新生代 老年代
-XX:+UseSerialGC Serial Serial Old
-XX:+UseParallelGC -XX:+UseParallelOldGC Parallel Scavenge Parallel Old
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC ParNew CMS
-XX:+UseG1GC G1 G1

7 參考

《深入理解Java虛擬機器》——周志明