官术网_书友最值得收藏!

2.2 G1停頓預測模型

G1是一個響應時間優先的GC算法,用戶可以設定整個GC過程的期望停頓時間,由參數MaxGCPauseMillis控制,默認值200ms。不過它不是硬性條件,只是期望值,G1會努力在這個目標停頓時間內完成垃圾回收的工作,但是它不能保證,即也可能完不成(比如我們設置了太小的停頓時間,新生代太大等)。

那么G1怎么滿足用戶的期望呢?就需要停頓預測模型了。G1根據這個模型統計計算出來的歷史數據來預測本次收集需要選擇的堆分區數量(即選擇收集哪些內存空間),從而盡量滿足用戶設定的目標停頓時間。如使用過去10次垃圾回收的時間和回收空間的關系,根據目前垃圾回收的目標停頓時間來預測可以收集多少的內存空間。比如最簡單的辦法是使用算術平均值建立一個線性關系來預測。如過去10次一共收集了10GB的內存,花費了1s,那么在200ms的停頓時間要求下,最多可以收集2GB的內存空間。G1的預測邏輯是基于衰減平均值和衰減標準差。

衰減平均(Decaying Average)是一種簡單的數學方法,用來計算一個數列的平均值,核心是給近期的數據更高的權重,即強調近期數據對結果的影響。衰減平均計算公式如下所示:

式中α為歷史數據權值,1-α為最近一次數據權值。即α越小,最新的數據對結果影響越大,最近一次的數據對結果影響最大。不難看出,其實傳統的平均就是α取值為(n-1)/n的情況。

同理,衰減方差的定義如下:

停頓預測模型是以衰減標準差為理論基礎實現的,代碼如下所示:

hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
double get_new_prediction(TruncatedSeq* seq) {
  return MAX2(seq->davg() + sigma() * seq->dsd(),
              seq->davg() * conf idence_factor(seq->num()));
}

在這個預測計算公式中:

·davg表示衰減均值。

·sigma()返回一個系數,來自G1ConfidencePercent(默認值為50,sigma為0.5)的配置,表示信賴度。

·dsd表示衰減標準偏差。

·confidence_factor表示可信度相關系數,confidence_factor當樣本數據不足時(小于5個)取一個大于1的值,并且樣本數據越少該值越大。當樣本數據大于5時confidence_factor取值為1。這是為了彌補樣本數據不足,起到補償作用。

·方法的參數TruncateSeq,顧名思義,是一個截斷的序列,它只跟蹤序列中最新的n個元素。在G1 GC過程中,每個可測量的步驟花費的時間都會記錄到TruncateSeq(繼承了AbsSeq)中,用來計算衰減均值、衰減變量、衰減標準偏差等,代碼如下所示:

hotspot/src/share/vm/utilities/numberSeq.cpp
void AbsSeq::add(double val) {
  if (_num == 0) {
    // 初始時,還沒有歷史數據,davg就是當前參數,dvar設置為0
    _davg = val;
    _dvariance = 0.0;
  } else {
    _davg = (1.0 - _alpha) * val + _alpha * _davg;
    double diff = val - _davg;
    _dvariance = (1.0 - _alpha) * diff * diff + _alpha * _dvariance;
  }
}

這個add方法就是上面兩個衰減公式的實現代碼。其中_davg為衰減均值,_dvariance為衰減方差,_alpha默認值為0.7。G1的軟實時停頓就是通過這樣的預測模型來實現的。

主站蜘蛛池模板: 阜南县| 兴海县| 广丰县| 余庆县| 自治县| 习水县| 荆州市| 邢台县| 神农架林区| 荣成市| 新平| 东兴市| 烟台市| 安泽县| 静安区| 明光市| 长垣县| 北流市| 横山县| 手机| 莲花县| 桃江县| 潢川县| 延长县| 新闻| 吉林省| 衡东县| 固始县| 巩义市| 秀山| 梅河口市| 东平县| 绩溪县| 周口市| 东至县| 台安县| 廊坊市| 和田市| 积石山| 华容县| 宝坻区|