JVM垃圾收集器

前言:

垃圾回收器從線程運行狀況分類有三種
  • 串行回收,Serial回收器,單線程回收,全程stw;
    • 缺點是隻有一個線程,執行垃圾回收時程序中止的時間比較長
  • 並行回收,名稱以Parallel開頭的回收器,多線程回收,全程stw;
    • 指多條垃圾收集線程並行工做,但此時用戶線程仍然處於等待狀態。
    • 多個線程執行垃圾回收適合於吞吐量的系統,回收時系統會中止運行 高併發項目適合
  • 併發回收,cms與G1,多線程分階段回收,只有某階段會stw;
    • 指用戶線程與垃圾收集線程同時執行(但不必定是並行的,可能會交替進行),用戶程序在繼續鏡像,而垃圾收集程序運行於另外一個CPU上。

 

下面經常使用的四個收集器:

1.Serial收集器(複製算法)

  • 串行收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程去回收。
  • 新生代、老年代使用串行回收;新生代複製算法、老年代標記-壓縮;
  • 垃圾收集的過程當中會Stop The World(服務暫停)
  • 一個單線程的收集器,在進行垃圾收集時候,必須暫停其餘全部的工做線程直到它收集結束。
  • 經過JVM參數-XX:+UseSerialGC可使用串行垃圾回收器。

特色:CPU利用率最高,停頓時間即用戶等待時間比較長。算法

適用場景:小型應用服務器

 

2.ParNew收集器(中止-複製算法)

  • ParNew收集器其實就是Serial收集器的多線程版本。
  • 新生代並行,老年代串行;新生代複製算法、老年代標記-壓縮
  • 參數控制:-XX:+UseParNewGC ParNew收集器。-XX:ParallelGCThreads 限制線程數量。
  • 新生代並行,老年代串行目的:回收頻率決定的。

 

3.Parallel 收集器 (中止-複製算法)

  • Parallel Scavenge收集器相似ParNew收集器。
  • Parallel收集器更關注系統的吞吐量(並行的)。能夠經過參數來打開自適應調節策略,虛擬機會根據當前系統的運行狀況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或最大的吞吐量
  • 也能夠經過參數控制GC的時間不大於多少毫秒或者比例;新生代複製算法、老年代標記-壓縮
  • 經過JVM參數-XX:+UseParallelGC 打開併發標記掃描垃圾回收器。

採用多線程來經過掃描並壓縮堆 特色:停頓時間短,回收效率高,對吞吐量要求高。 適用場景:大型應用,科學計算,大規模數據採集等。多線程

 

4.CMS收集器(標記-清理算法)

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器。目前很大一部分的Java應用都集中在互聯網站或B/S系統的服務端上,這類應用尤爲重視服務的響應速度,但願系統停頓時間最短,以給用戶帶來較好的體驗。 從名字(包含「Mark Sweep」)上就能夠看出CMS收集器是基於「標記-清除」算法實現的,它的運做過程相對於前面幾種收集器來講要更復雜一些,整個過程分爲4個步驟,包括:併發

  • 初始標記(CMS initial mark)
  • 併發標記(CMS concurrent mark)
  • 從新標記(CMS remark)
  • 併發清除(CMS concurrent sweep)

其中初始標記、從新標記這兩個步驟仍然須要「Stop The World」。初始標記僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快,併發標記階段就是進行GC Roots Tracing的過程,而從新標記階段則是爲了修正併發標記期間,因用戶程序繼續運做而致使標記產生變更的那一部分對象的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但遠比並發標記的時間短。高併發

因爲整個過程當中耗時最長的併發標記和併發清除過程當中,收集器線程均可以與用戶線程一塊兒工做,因此整體上來講,CMS收集器的內存回收過程是與用戶線程一塊兒併發地執行。老年代收集器(新生代使用ParNew)
經過JVM參數 -XX:+UseConcMarkSweepGC設置性能

優勢:網站

併發收集、低停頓、響應時間快

缺點:spa

1.對CPU資源很是敏感線程

2.CMS收集器沒法處理浮動垃圾,即清除時用戶進程同時產生的垃圾,只能等到下次GC時回收,併發階段會下降吞吐量code

3.由於是使用「標記-清除」算法,因此會產生大量碎片

特色:響應時間優先,減小垃圾收集停頓時間,適用於對響應時間要求高的系統

適應場景:大型服務器等。

5.G1收集器

在G1中,堆被劃分紅 許多個連續的區域(region)。採用G1算法進行回收,吸取了CMS收集器特色。

特色:支持很大的堆,高吞吐量

  • 支持多CPU和垃圾回收線程
  • 在主線程暫停的狀況下,使用並行收集
  • 在主線程運行的狀況下,使用併發收集

實時目標:可配置在N毫秒內最多隻佔用M毫秒的時間進行垃圾回收

經過JVM參數 -XX:+UseG1GC 使用G1垃圾回收器

注意: 併發是指一個處理器同時處理多個任務。 並行是指多個處理器或者是多核的處理器同時處理多個不一樣的任務。 併發是邏輯上的同時發生(simultaneous),而並行是物理上的同時發生。 來個比喻:併發是一我的同時吃三個饅頭,而並行是三我的同時吃三個饅頭。

相關文章
相關標籤/搜索