Java GC 必知必會(huì)-垃圾回收器篇

1. 垃圾回收器的分類

  • 按線程數(shù):串行垃圾和并行
  • 按工作模式:并發(fā)式和獨(dú)占式
    1. 并發(fā)式:垃圾回收線程與用戶線程交替工作,減少應(yīng)用程序的停頓時(shí)間。
    2. 獨(dú)占式:一旦運(yùn)行,停止其他用戶線程,知道垃圾回收過程結(jié)束。
  • 按內(nèi)存碎片情況:
  1. 壓縮:回收完成后,會(huì)對(duì)存活對(duì)象進(jìn)行內(nèi)存整理。再次分配時(shí)可以使用指針碰撞
  2. 非壓縮:不會(huì)整理內(nèi)存碎片,需要空閑列表來維護(hù)可用空間。
  • 按工作的內(nèi)存區(qū)域
  1. 新生代
  2. 老年代

2. 垃圾回收器的標(biāo)準(zhǔn)

  • 在保證最大吞吐量的情況下,盡可能的減少響應(yīng)時(shí)間

3. 垃圾回收器的組合

image.png

JDK8中默認(rèn)的是ParallelScavengeGC +ParllelOldGC

  • 紅色虛線說明
    在JDK8中對(duì)SerialGC+CMS GCParNewGC+SerialOldGC進(jìn)行來過期處理,在JDK9中徹底移除。
  • 綠色虛線說明
    在JDK14中,Parallel ScavengeGC+ SerialOldGC 過期處理
  • 藍(lán)色線框說明
    在JDK14中 ,將CMS刪除了

4. 如何查看默認(rèn)垃圾回收器

JDK8中默認(rèn)使用的是Parallel ScavengeGC +ParallelOldGC


image.png

5. Serial與Serial Old垃圾回收器

Serial

  • Serial回收器是歷史比較悠久的一種回收器,在jdk1.3之前垃圾回收的唯一選擇。
  • HotSpot中client模式下的針對(duì)年輕代默認(rèn)垃圾回收器
  • SerialGC針對(duì)的是年輕代的收集,采用復(fù)制算法串行回收+STW機(jī)制。

Serial Old

  • HotSpot中client模式下的老年代默認(rèn)垃圾回收器

  • SerialOld是針對(duì)老年代的回收,也是采用的串行回收,但是算法采用的標(biāo)記-壓縮

  • SerialOld 在server模式下,1. 主要是配合Parallel ScavengeGC使用(JDK14中已過期),2. 作為CMS的退化備選方案。

image.png

Serial 和SerialOld 的優(yōu)點(diǎn):

image.png

如何使用

image.png

6. ParNew垃圾回收器

  • ParNew 是Serial 的并行版本, New代表了只針對(duì)新生代進(jìn)行處理,采用復(fù)制算法+并行的方式回收垃圾。
  • 適用于多CPU下。大部分情況下與CMS搭配使用。
image.png
image.png

7. Parallel Scavenge 與Parallel Old垃圾回收器(吞吐量?jī)?yōu)先)

  • Parallel Scavenge 一般和Parallel Old搭配使用,但是也可以和serialOld搭配(在JDK14 中被移除)
  • Parallel Scavenge 也采用復(fù)制算法+并行+STW機(jī)制
  • Parallel Scavenge 和ParalleNew 有什么區(qū)別:
    1. Parallel Scavenge的目標(biāo)是達(dá)到一個(gè)可控制吞吐量的垃圾回收器。也被稱為吞吐量?jī)?yōu)先垃圾回收器。
    2. Parallel Scavenge有自適應(yīng)調(diào)節(jié)策略。

Parallel Old

  • Parallel Old采用標(biāo)記壓縮+并行+STW
image.png

8. CMS (Concurrent-Mark-Sweep)垃圾回收器(響應(yīng)時(shí)間優(yōu)先)

  • CMS使用的是標(biāo)記-清除算法
  • CMS 針對(duì)的是老年代,新生代可搭配SerialGC 或ParNewGC
  • CMS 會(huì)產(chǎn)生2次STW,分別是初始標(biāo)記,重寫標(biāo)記
  • 觸發(fā)CMS的情況:
    1. 擴(kuò)容縮容會(huì)觸發(fā) Old 區(qū)達(dá)到回收閾值、MetaSpace 空間不足、Young 區(qū)晉升失敗、大對(duì)象擔(dān)保失敗,手工調(diào)用System.gc()
image.png
  • 初始標(biāo)記(Initial-Mark ): 僅僅標(biāo)記出GCRoot能直接關(guān)聯(lián)的對(duì)象,會(huì)發(fā)生STW,執(zhí)行時(shí)間較短。

  • 并發(fā)標(biāo)記(Concurrent-Mark): 從GCRoot可以直接關(guān)聯(lián)的對(duì)象遍歷整個(gè)對(duì)象圖的過程。執(zhí)行時(shí)間較長(zhǎng),但是可以與用戶線程并行執(zhí)行。

  • 重新標(biāo)記(Remark): 修正并發(fā)標(biāo)記期間,因用戶線程線程繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記變動(dòng)的那一步部分對(duì)象的標(biāo)記記錄。通常比Initial-Mark 的執(zhí)行時(shí)間長(zhǎng),但是比Concurrent-Mark要短。 會(huì)發(fā)生STW。

  • 并發(fā)清理: 清除那些需要被刪除的對(duì)象,釋放內(nèi)存。(標(biāo)記-清除算法)

  • 重置線程

CMS的特點(diǎn)

  • 優(yōu)點(diǎn)
    1. 低延遲
  • 缺點(diǎn):
    1. 產(chǎn)生內(nèi)存碎片,當(dāng)遇到大對(duì)象時(shí),可能會(huì)提前觸發(fā)full GC當(dāng)發(fā)生
    2. 對(duì)CPU資源敏感,因?yàn)榕c用戶線程并行執(zhí)行,從總體來說降低了吞吐量。
  1. CMS 發(fā)生收集器退化對(duì)情況

參考文獻(xiàn):
https://tech.meituan.com/2020/11/12/java-9-cms-gc.html

9. G1垃圾回收器:分區(qū)收集

  • 核心設(shè)計(jì): 延遲可控的情況下,盡可能獲得高的吞吐量。
  • 主要針對(duì)多核心CPU+大內(nèi)存的機(jī)器

為什么叫G1

image.png

G1 相比于其他垃圾回收器的特點(diǎn)

  1. 并行并發(fā)&分帶收集


    image.png
image.png
  1. 空間整理

    • CMS 使用標(biāo)記-清除,會(huì)有內(nèi)存碎片,執(zhí)行若干次GC后才會(huì)整理內(nèi)存。
    • G1 將內(nèi)存劃分為Region,在region之間是復(fù)制算法,當(dāng)整體上來看是標(biāo)記-壓縮.兩重算法都避免來內(nèi)存碎片。尤其當(dāng)java 堆特別大時(shí),G1 的性能更明顯。
  2. 可預(yù)測(cè)的時(shí)間停頓


    image.png

G1 Region 化整為零

image.png
image.png
  1. G1 Region 為什么要新增一個(gè)Humongous區(qū):


    image.png

G1 的回收過程

年輕代GC(YoungGC)

  1. 當(dāng)eden區(qū)內(nèi)存空間不足時(shí),會(huì)觸發(fā)YoungGC
    老年代并發(fā)標(biāo)記(Concurrent Marking)
    混合回收(Mixed GC)
    FullGC
image.png
image.png

G1垃圾回收過程的詳細(xì)說明:

image.png

image.png
image.png
image.png
image.png

G1 記憶集與寫屏障

image.png
image.png

關(guān)于G1 的優(yōu)化

image.png

7中垃圾回收器的總結(jié)

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容