1. 程式人生 > >JVM GC演算法和垃圾收集器

JVM GC演算法和垃圾收集器

演算法

  • 標記-清除:產生大量離散碎片
  • 複製演算法:三個區域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一路往下標記
    • 最終標記:將二次標記的結果加進本區域的標記集合中
    • 篩選回收:篩選價值最大的區域開始回收