一驾中、背景
數(shù)據(jù)計算系統(tǒng)唉堪,日處理數(shù)據(jù)量在上億的規(guī)模; 簡單來說就是不停的從各種存儲中讀取大量數(shù)據(jù)在內(nèi)存中進(jìn)行計算處理肩民,大致每分鐘執(zhí)行500次數(shù)據(jù)提取和計算任務(wù)
總共5臺機(jī)器唠亚,那么每臺機(jī)器每分鐘大概負(fù)責(zé)100次數(shù)據(jù)提取和計算,每次提取 1萬條數(shù)據(jù)持痰,平均計算耗時10秒
二灶搜、GC過程分析
機(jī)器配置4C8G, 堆3G共啃、年輕代1.5G占调、老年代1.5G
數(shù)據(jù)分析的每條數(shù)據(jù)比較大,20個字段移剪,平均大小在1kb究珊,那么每次計算的1萬條數(shù)據(jù)為 10MB 大小
新生代多快會塞滿?
執(zhí)行一次產(chǎn)生10m 對象纵苛,一分鐘執(zhí)行100次剿涮, 10m * 100 大概1G,加上其他系統(tǒng)對象 eden區(qū)就被塞滿
觸發(fā)minor gc后有多少對象晉升老年代
一分鐘后攻人,進(jìn)行一次 minor gc取试,假設(shè)有80個計算任務(wù)執(zhí)行完畢了,還有20個任務(wù)還沒執(zhí)行完畢 此時存活對象有 200M怀吻,survivor 放不下瞬浓,只能進(jìn)入老年代
老年代多久會塞滿,進(jìn)行full gc蓬坡?
每次 minor gc 有200m的對象進(jìn)入老年代猿棉,當(dāng)進(jìn)行第七次minor gc 后磅叛, 老年代就只剩100m了,然后當(dāng)發(fā)生第8次 minor gc 的時候由于空間擔(dān)保 老年代不足以存放歷次 minor gc晉升的對象大小萨赁,就要先進(jìn)行 full gc弊琴; 也就是平均 8分鐘進(jìn)行一次 full gc,頻率非常高
三杖爽、如何優(yōu)化敲董?
按照現(xiàn)有的 內(nèi)存分配,最大的問題是 每次minor gc 的時候 survivor 區(qū)都不夠存放存活對象慰安,導(dǎo)致全部晉升到老年代腋寨;
調(diào)整內(nèi)存比例 3G的堆內(nèi)存,2G年輕代(Eden 1.6G化焕、 Survivor 200MB * 2) + 1G老年代
這樣每次 minor gc 基本就很少進(jìn)入老年代 大大降低了 full gc 的頻率
但是還要注意 “動態(tài)年齡判斷”精置,回收后 survivor區(qū)域 同齡對象超過其一半,就要直接進(jìn)入老年代 還可以通過 -XX:survivorRatio=8 進(jìn)行調(diào)整锣杂,降低eden區(qū)的比例