- JVM G1源碼分析和調優
- 彭成寒
- 973字
- 2019-04-22 18:14:52
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的軟實時停頓就是通過這樣的預測模型來實現的。
- Web應用系統開發實踐(C#)
- Design Principles for Process:driven Architectures Using Oracle BPM and SOA Suite 12c
- SpringMVC+MyBatis快速開發與項目實戰
- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- Learning Selenium Testing Tools(Third Edition)
- Mastering Predictive Analytics with Python
- 劍指Java:核心原理與應用實踐
- 持續輕量級Java EE開發:編寫可測試的代碼
- 微信小程序開發實戰:設計·運營·變現(圖解案例版)
- OpenMP核心技術指南
- Unity Character Animation with Mecanim
- 從0到1:HTML5 Canvas動畫開發
- 金融商業數據分析:基于Python和SAS
- Java語言程序設計與實現(微課版)
- Java程序設計