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