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

JDK8中默認(rèn)的是ParallelScavengeGC +ParllelOldGC
- 紅色虛線說明
在JDK8中對(duì)SerialGC+CMS GC和ParNewGC+SerialOldGC進(jìn)行來過期處理,在JDK9中徹底移除。 - 綠色虛線說明
在JDK14中,Parallel ScavengeGC+ SerialOldGC過期處理 - 藍(lán)色線框說明
在JDK14中 ,將CMS刪除了
4. 如何查看默認(rèn)垃圾回收器
JDK8中默認(rèn)使用的是Parallel ScavengeGC +ParallelOldGC

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的退化備選方案。

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

如何使用

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


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

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的情況:
- 擴(kuò)容縮容會(huì)觸發(fā) Old 區(qū)達(dá)到回收閾值、MetaSpace 空間不足、Young 區(qū)晉升失敗、大對(duì)象擔(dān)保失敗,手工調(diào)用System.gc()

初始標(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)
- 低延遲
- 缺點(diǎn):
- 產(chǎn)生內(nèi)存碎片,當(dāng)遇到大對(duì)象時(shí),可能會(huì)提前觸發(fā)full GC當(dāng)發(fā)生
- 對(duì)CPU資源敏感,因?yàn)榕c用戶線程并行執(zhí)行,從總體來說降低了吞吐量。
- 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

G1 相比于其他垃圾回收器的特點(diǎn)
-
并行并發(fā)&分帶收集
image.png

-
空間整理
- 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 的性能更明顯。
-
可預(yù)測(cè)的時(shí)間停頓
image.png
G1 Region 化整為零


-
G1 Region 為什么要新增一個(gè)Humongous區(qū):
image.png
G1 的回收過程
年輕代GC(YoungGC)
- 當(dāng)eden區(qū)內(nèi)存空間不足時(shí),會(huì)觸發(fā)YoungGC
老年代并發(fā)標(biāo)記(Concurrent Marking)
混合回收(Mixed GC)
FullGC


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





G1 記憶集與寫屏障


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

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



