死神
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):速度極快。
- 1、這個過程
-
并發(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)
- 1、這個過程
-
最終標(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、這個過程
-
混合回收??:
- 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%。
- 1、這個過程
-
混合回收??失敗時(shí):
- 1、在Mixed回收??的時(shí)候,無論是年輕代還是老年代都是基于復(fù)制算法進(jìn)行回收??,都要把各個Region的存活對象拷貝到另外其他的Region里去,萬一拷貝是發(fā)生空間不足,就會觸發(fā)一次失敗。一旦回收失敗,立馬就會切換采用Serial 單線程進(jìn)行標(biāo)記+清理+整理,
整個過程是非常慢的(災(zāi)難)
。
- 1、在Mixed回收??的時(shí)候,無論是年輕代還是老年代都是基于復(fù)制算法進(jìn)行回收??,都要把各個Region的存活對象拷貝到另外其他的Region里去,萬一拷貝是發(fā)生空間不足,就會觸發(fā)一次失敗。一旦回收失敗,立馬就會切換采用Serial 單線程進(jìn)行標(biāo)記+清理+整理,