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 在移動對象時,對象引用仍然可以訪問。

KnlJAS.png

Init Mark 啟動並發標記階段:

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM