分代收集算法
當(dāng)前主流 VM 垃圾收集都采用”分代收集”(Generational Collection)算法, 這種算法會根據(jù) 對象存活周期的不同將內(nèi)存劃分為幾塊, 如 JVM 中的 新生代、老年代、永久代,這樣就可以根據(jù) 各年代特點(diǎn)分別采用最適當(dāng)?shù)?GC 算法。
在新生代-復(fù)制算法:
每次垃圾收集都能發(fā)現(xiàn)大批對象已死, 只有少量存活. 因此選用復(fù)制算法, 只需要付出少量 存活對象的復(fù)制成本就可以完成收集。
在老年代-標(biāo)記整理算法:
因?yàn)閷ο蟠婊盥矢摺]有額外空間對它進(jìn)行分配擔(dān)保, 就必須采用“標(biāo)記—清理”或“標(biāo) 記—整理”算法來進(jìn)行回收, 不必進(jìn)行內(nèi)存復(fù)制, 且直接騰出空閑內(nèi)存。
1、ParNew:一款多線程的收集器,采用復(fù)制算法,主要工作在 Young 區(qū),可以通過 -XX:ParallelGCThreads 參數(shù)來控制收集的線程數(shù),整個(gè)過程都是 STW 的,常與 CMS 組合使用。
2、CMS:以獲取最短回收停頓時(shí)間為目標(biāo),采用“標(biāo)記-清除”算法,分 4 大步進(jìn)行垃圾收集,其中初始標(biāo)記和重新標(biāo)記會 STW ,多數(shù)應(yīng)用于互聯(lián)網(wǎng)站或者 B/S 系統(tǒng)的服務(wù)器端上,JDK9 被標(biāo)記棄用,JDK14 被刪除。
分區(qū)收集算法
分區(qū)算法則將整個(gè)堆空間劃分為連續(xù)的不同小區(qū)間, 每個(gè)小區(qū)間獨(dú)立使用, 獨(dú)立回收. 這樣做的 好處是可以控制一次回收多少個(gè)小區(qū)間 , 根據(jù)目標(biāo)停頓時(shí)間, 每次合理地回收若干個(gè)小區(qū)間(而不是 整個(gè)堆), 從而減少一次 GC 所產(chǎn)生的停頓。
G1: 一種服務(wù)器端的垃圾收集器,應(yīng)用在多處理器和大容量內(nèi)存環(huán)境中,在實(shí)現(xiàn)高吞吐量的同時(shí),盡可能地滿足垃圾收集暫停時(shí)間的要求。
ZGC:JDK11 中推出的一款低延遲垃圾回收器,適用于大內(nèi)存低延遲服務(wù)的內(nèi)存管理和回收,SPECjbb 2015 基準(zhǔn)測試,在 128G 的大堆下,最大停頓時(shí)間才 1.68 ms,停頓時(shí)間遠(yuǎn)勝于 G1 和 CMS。