天天看點

JVM學習筆記——GC垃圾收集器

  Java 堆記憶體采用分代回收算法,是以 JVM 針對新生代和老年代提供了多種垃圾收集器。

  Serial 收集器是單線程收集器,采用複制算法。

  是最基本的垃圾收集器,隻會使用一個 CPU 或一條線程去完成垃圾收集工作,在垃圾收集時必須停止其他工作線程知道垃圾收集結束。

單線程收集器

使用複制算法

收集時需要暫停其他所有線程

簡單高效,沒有線程互動開銷,垃圾收集效率最高

是 JVM 在 Client 模式下預設的新生代垃圾收集器

  是 Serial 收集器的老年代版本

使用标記整理算法

是 JVM 在 Client 模式下預設的老年代垃圾收集器

是 JVM 在 Server 模式下 CMS 的後備收集方案

  ParNew 垃圾收集器是 Serial 的多線程版本,也采用複制算法,其餘行為和 Serial 完全一樣。

多線程收集器

收集時需要暫停其他線程

預設開啟和 CPU 數目相同的線程數,通過<code>-XX:ParallelGCThreads</code>參數設定線程數

是 JVM 在 Server 模式下預設的新生代垃圾收集器

  Prarllel Scavenge 收集器是一個新生代垃圾收集器,采用複制算法,是一個多線程的垃圾收集器,它的側重點是程式達到可控的吞吐量,高吞吐量可以最高效率的利用 CPU 資源。

注重提高系統吞吐量,提高 CPU 使用率

具有自适應調節政策

  Prarllel Scavenge 收集器的老年代版本,使用多線程标記整理算法。如果系統對吞吐量要求較高,可以采用 Prarllel Scavenge 與 Prarllel Old 搭配政策。

注重提高系統吞吐量

  CMS 收集器是一種老年代收集器,主要目标是獲得最短垃圾回收停頓時間,以獲得較高的響應比,提高使用者體驗。使用多線程的标記清除算法。

使用标記清除算法

注重縮短垃圾收集停頓時間,追求高響應比

工作機制如下:

初始标記:隻标記 GC Roots 能直接關聯的對象,速度快,需要暫停所有線程

并發标記:進行 GC Roots 追蹤,和使用者線程一起工作,不需要暫停

重新标記:修正在并發标記期間,使用者線程運作而導緻标記改變的對象,需要暫停所有線程

并發清除:清除 GC Roots 不可達對象,和使用者線程一起工作,不需要暫停

  由于耗時最長的并發标記和并發清除不需要暫停其他線程,CMS 可近似看做與使用者線程并發執行。

  Garbage First 垃圾收集器是目前垃圾收集器理論最前沿的成果。

  G1 避免全區域垃圾收集,把堆記憶體劃分為大小固定的幾個獨立區域,并跟蹤這些區域的垃圾收集進度,在背景維護一個優先級清單,每次根據允許收集時間來優先回收垃圾最多的區域。

相較于 CMS,G1 有如下優勢:

基于标記整理算法,不産生記憶體碎片

可精确控制停頓時間,在不犧牲吞吐量的前提下實作低停頓回收

收集器

運作模式

工作範圍

算法

目标

适用場景

Serial

串行

新生代

複制算法

響應速度優先

單CPU環境下的Client模式

Serial Old

老年代

标記整理

單CPU環境下的Client模式、CMS的後備預案

ParNew

并行

多CPU環境時在Server模式下與CMS配合

Parallel Scavenge

吞吐量優先

在背景運算而不需要太多互動的任務

Parallel Old

CMS

并發

标記清除

集中在網際網路站或B/S系統服務端上的Java應用

G1

Both

複制+标記整理

面向服務端應用,将來替換CMS