The Z Garbage Collector (ZGC) 【1】

簡介

Java 11 中帶了一個新的GC回收器:Z Garbage Collector (ZGC)併發

  • 可伸縮
  • 低延遲
  • 併發執行

適用於:性能

  • 對延遲有要求
    • 10ms 級別
  • 巨大的堆空間
    • TB 單位

Java 11 才引入,目前仍是實驗性質線程

啓用

能夠經過:-XX:+UseZGC啓用ZGC; 還須要帶上:-XX:+UnlockExperimentalVMOptions(解鎖隱藏vm選項)code

堆空間大小設定

ZGC中最重要的參數,就是堆的最大空間:-Xmx內存

由於ZGC是併發執行,因此最大堆空間必須設定:資源

  1. 堆中存放着應用中活動數據
  2. 若是堆中有足夠的可用空間,那麼在GC期間,分配器就能夠繼續工做
    • 也只有這樣纔是併發GC
    • 這就須要對分配器速率與活動數據集的大小進行預估,一般:
      1. 更大的內存空間,ZGC越能更好的工做
      2. 但與此同時,內存可能就會浪費
      • 須要在這兩個方面尋找一個平衡點

併發GC的線程數

對於ZGC併發執行GC的線程數量,能夠經過:-XX:ConcGCThreads設定。io

ZGC默認會自動測算出一個合理的線程數量:並行

  • 一般狀況,這個測算出來的數值是比較合理的
  • 這個參數,實際是決定了分配多少CPU時間(資源)用於GC
    • 若是太多,則GC會佔用過多CPU資源,從而影響應用的正常運行
    • 若是太少,則會讓GC吞吐降低,也會影響應用的內存分配

GC選用策略

若是不是對暫停時間有特殊要求,那麼請儘可能讓VM本身來選擇GC策略。im

若是須要,還能夠經過調整堆區大小,來改進性能。若是還不能達到性能要求,能夠從如下幾個方面來選擇GC策略:數據

  • 若是應用所需的內存很小(如:100MB左右)
    • 那直接選用串行GC便可:-XX:+UseSerialGC
  • 若是應用運行在單核處理器環境;或者對暫停時間沒什麼要求的場景
    • 那應當優先選用串行GC:-XX:+UseSerialGC
  • 若是很在意應用的峯值性能,而且對暫停時間無要求(或者能夠接受一個較長的暫停時間)
    • 則可選用並行GC策略:-XX:+UseParallelGC
  • 若是更看重響應時間,而不是總體吞吐率
    • 而且指望GC暫停時間想要控制在秒級
      • 那麼能夠選用mostly concurrent收集策略
        • -XX:+UseG1GC
        • -XX:+UseConcMarkSweepGC
  • 若是對響應時間有極高要求,或者使用的堆很是大(TB級),那麼能夠嘗試:-XX:UseZGC(徹底併發回收)

以上策略僅僅是選用GC的通常思路。GC性能主要取決於:

  • 堆大小
  • 應用數據的實時存活狀況
  • 處理器的數量和性能

若是通過這些分析,沒有得到預期中的性能表現。請首先嚐試調整堆區大小、分代空間大小;若是性能仍然不理想,再嘗試不一樣的GC策略:

  • 使用併發GC,以減小暫停時間
  • 使用並行GC,在多核環境下改善總體吞吐量
相關文章
相關標籤/搜索