Java12新特性 -- Shenandoah GC

Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣佈進行的一項垃圾收集器研究項目 Pauseless GC 的實現,旨在針對 JVM 上的內存收回實現低停頓的需求。該設計將與應用程序線程併發,經過交換 CPU 併發週期和空間以改善停頓時間,使得垃圾回收器執行線程可以在 Java 線程運行時進行堆壓縮,而且標記和整理可以同時進行,所以避免了在大多數 JVM 垃圾收集器中所遇到的問題。算法

Shenandoah GC 主要目標是 99.9% 的暫停小於 10ms,暫停與堆大小無關等。併發

垃圾回收期的分類:
  • 按線程數分,能夠分爲串行垃圾回收器和並行垃圾回收器。
    • 串行回收指的是在同一時間段內只容許一件事情發生,簡單來講,當多個CPU 可用時,也只能有一個CPU
      用於執行垃圾回收操做,井且在執行垃圾回收時,程序中的工做線程將會被暫停,當垃圾收集工做完成後
      纔會恢復以前被暫停的工做線程,這就是串行回收。
    • 和串行回收相反,並行收集能夠運用多個CPU 同時執行垃圾回收,所以提高了應用的吞吐量,不過並行回
      收仍然與串行回收同樣,採用獨佔式,使用了「 Stop-the-world 」機制和複製算法。
  • 按照工做模式分,能夠分爲併發式回收器和獨佔式垃圾回收器。
    • 併發式垃圾回收器與應用程序線程交替工做,以儘量減小應用程序的停頓時間。
    • 獨佔式垃圾回收器( Stop the world)一旦運行,就中止應用程序中的其餘全部線程,直到垃圾回收過程完
      全結束。
  • 按碎片處理方式可分爲壓縮式垃圾回收器和非壓縮式垃圾回收器。
    • 壓縮式垃圾回收器會在回收完成後,對存活對象進行壓縮整理,消除回收後的碎片。
    • 非壓縮式的垃圾回收器不進行這步操做。
  • 按工做的內存區間,又可分爲年輕代垃圾回收器老年代垃圾回收器
如何評估一款GC的性能
  • 吞吐量:程序的運行時間(程序的運行時間+內存回收的時間)。
  • 垃圾收集開銷:吞吐量的補數,垃圾收集器所佔時間與總時間的比例。
  • 暫停時間:執行垃圾收集時,程序的工做線程被暫停的時間。
  • 收集頻率:相對於應用程序的執行,收集操做發生的頻率。
  • 堆空間: Java 堆區所佔的內存大小。
  • 快速: 一個對象從誕生到被回收所經歷的時間。
Shenandoah GC工做原理:

其內存結構與 G1 很是類似,都是將內存劃分爲相似棋盤的region。總體流程與 G1 也是比較類似的,最大的區別在於實現了併發的 疏散(Evacuation) 環節,引入的 BrooksForwarding Pointer 技術使得 GC 在移動對象時,對象引用仍然能夠訪問。less

KnlJAS.png

Init Mark 啓動併發標記階段:jvm

  1. 併發標記遍歷堆階段
  2. 併發標記完成階段
  3. 併發整理回收無活動區域階段
  4. 併發 Evacuation 整理內存區域階段
  5. Init Update Refs 更新引用初始化 階段
  6. 併發更新引用階段
  7. Final Update Refs 完成引用更新階段
  8. 併發回收無引用區域階段
配置或調試 Shenandoah 的 JVM 參數:
  1. -XX:+AlwaysPreTouch:使用全部可用的內存分頁,減小系統運行停頓,爲避免運行時性能損失。
  2. -Xmx == -Xmsv:設置初始堆大小與最大值一致,能夠減輕伸縮堆大小帶來的壓力,與 AlwaysPreTouch 參數配合使用,在啓動時提交全部內存,避免在最終使用中出現系統停頓。
  3. -XX:+ UseTransparentHugePages:可以大大提升大堆的性能,同時建議在 Linux 上使用時將
    /sys/kernel/mm/transparent_hugepage/enabled 和/sys/kernel/mm/transparent_hugepage/defragv 設置爲:madvise,同時與 AlwaysPreTouch 一塊兒使用時,init 和 shutdownv 速度會更快,由於它將使用更大的頁面進行預處理。
  4. -XX:+UseNUMA:雖然 Shenandoah 還沒有明確支持 NUMA(Non-Uniform Memory Access),但最好啓用此功
    能以在多插槽主機上啓用 NUMA 交錯。與 AlwaysPreTouch 相結合,它提供了比默認配置更好的性能。
  5. -XX:+DisableExplicitGC:忽略代碼中的 System.gc() 調用。當用戶在代碼中調用 System.gc() 時會強制
    Shenandoah 執行 STW Full GC ,應禁用它以防止執行此操做,另外還可使用 -
  6. XX:+ExplicitGCInvokesConcurrent,在 調用 System.gc() 時執行 CMS GC 而不是 Full GC,建議在有
    System.gc() 調用的狀況下使用。
    不過目前 Shenandoah 垃圾回收器還被標記爲實驗項目,若是要使用Shenandoah GC須要編譯時--with-jvmfeatures選項帶有shenandoahgc,而後啓動時使用參數
  7. -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
相關文章
相關標籤/搜索