jvm 優(yōu)化篇-(7)-G1回收過程(-XX:MaxGCPauseMillis、‐XX:G1MixedGCCountTarget、‐XX:G1HeapWastePercent、‐XX:G1Mix...

死神

1、G1垃圾回收??過程

1.1、觸發(fā)混合回收??條件:

???????? -XX:InitiatingHeapOccupancyPercent=45 ,當(dāng)老年代空間使用占整個堆空間45%時(shí)。

1.2、混合回收??范圍:

????????新生代、老年代、大對象。

1.3、混合回收過程:
  • 初始標(biāo)記
    • 1、這個過程會STW,停止系統(tǒng)線程。
    • 2、標(biāo)記GC-Roots的直接引用對象。
      • 1、線程棧中局部變量表 。
      • 2、方法區(qū)中的靜態(tài)變量。
      • 3、本地方法棧。
    • 3、特點(diǎn):速度極快。
  • 并發(fā)標(biāo)記
    • 1、這個過程不會STW,系統(tǒng)線程正常運(yùn)行。
    • 2、從第一階段標(biāo)記的GC-Roots開始追蹤所有存活對象。
    • 3、特點(diǎn):慢,很耗時(shí)。
    • 4、優(yōu)化:JVM會對“并發(fā)標(biāo)記”階段新產(chǎn)生的對象及對象修改做記錄(RememberSet)
  • 最終標(biāo)記
    • 1、這個過程會STW,系統(tǒng)線程停止運(yùn)行。
    • 2、會根據(jù)“并發(fā)標(biāo)記”階段記錄的RememberSet進(jìn)行對象標(biāo)記。
    • 3、特點(diǎn):很快。
    • 4、RememberSet相當(dāng)于是拿空間換時(shí)間。
  • 混合回收??
    • 1、這個過程會STW,系統(tǒng)線程停止運(yùn)行。
    • 2、會計(jì)算老年代中每個Region中存活對象數(shù)量,存活對象占比,執(zhí)行垃圾回收預(yù)期耗時(shí)和效率。
    • 3、耗時(shí):會根據(jù)啟動參數(shù)中-XX:MaxGCPauseMillis=200和歷史回收耗時(shí)來計(jì)算本次要回收??多少老年代Region才能耗時(shí)200ms。
    • 4、特點(diǎn):回收了一部分遠(yuǎn)遠(yuǎn)沒有達(dá)到回收??的效果,G1還有一個特殊處理方法,STW后進(jìn)行回收,然后恢復(fù)系統(tǒng)線程,然后再次STW,執(zhí)行混合回收掉一部分Region,‐XX:G1MixedGCCountTarget=8 (默認(rèn)是8次),反復(fù)執(zhí)行上述過程8次。eg:假設(shè)要回收400個Region,如果受限200ms,每次只能回收??50個Region,反復(fù)8次剛好全部回收完畢。------>這么做的好處是避免單次停頓回收??STW時(shí)間太長。
    • 5、還有一個參數(shù)要提一下‐XX:G1HeapWastePercent=5 (默認(rèn)是5%)。混合回收??是采用復(fù)制算法,把要回收的Region中存活的對象放入其他Region中,然后這個Region中的垃圾全部清理掉,這樣就會不斷有Region釋放出來,當(dāng)釋放出的Region占整個堆空間5%時(shí),停止混合回收??。
    • 6、還有一個參數(shù):‐XX:G1MixedGCLiveThresholdPercent=85 (默認(rèn)值85%) 。回收Region的時(shí)候,必須是存活對象低于85%。
  • 混合回收??失敗時(shí)
    • 1、在Mixed回收??的時(shí)候,無論是年輕代還是老年代都是基于復(fù)制算法進(jìn)行回收??,都要把各個Region的存活對象拷貝到另外其他的Region里去,萬一拷貝是發(fā)生空間不足,就會觸發(fā)一次失敗。一旦回收失敗,立馬就會切換采用Serial 單線程進(jìn)行標(biāo)記+清理+整理,整個過程是非常慢的(災(zāi)難)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。