JVM GC演算法和垃圾收集器
阿新 • • 發佈:2019-01-11
演算法:
- 標記-清除:產生大量離散碎片
- 複製演算法:三個區域eden(大)+2*survivor(小);每次在eden新建物件,gc的時候複製到另外一個survivor中,清除以前的兩個區域。
- 標記-整理:壓縮可用區域,將可用物件擠在一起
垃圾收集器:
- Serial 收集器(新生代):單執行緒阻塞所有使用者程序,採用複製演算法清理新生代
- Serial Old 收集器(老年代):Serial的老年代收集版本,採用標記整理演算法
- ParNew 收集器(新生代):Serial的多執行緒版本,採用多執行緒複製演算法
- Parallel Scavenge 收集器(新生代):和ParNew類似,更專注於提高吞吐量(=執行程式碼時間/執行程式碼時間+GC時間),自適應調節各個區域的比例、晉升老年代物件大小,達到一個更高的吞吐量
- Parallel Old收集器(老年代):於Parallel Scavenge配合,多執行緒標記整理演算法回收老年代
- CMS收集器(Concurrent Mark Sweep)(老年代):多執行緒標記清除演算法。
步驟:- 初始標記:標記GC ROOT直接關聯物件
- 併發標記:從GC ROOT一路往下標記
- 重新標記:標記使用者程式變化的那一部分
- 併發清理:清理無效物件
- G1 收集器(整個堆):將堆記憶體劃分成很多的大小相等的獨立區域,然後標記之後對每個區域的回收價值大小排序,優先從價值大的區域開始回收。
將需要回收的區域存活物件複製到其他不需要回收的區域中。
步驟:(每個區域有一個數據結構儲存該區域的標記物件集合)- 初始標記:標記GC ROOT直接關聯物件
- 併發標記:從GC ROOT一路往下標記
- 最終標記:將二次標記的結果加進本區域的標記集合中
- 篩選回收:篩選價值最大的區域開始回收