一房午、并發(fā)標記
目的
傳統(tǒng)收集器進行可達性分析標記時丹允,會暫停所有用戶線程袋倔。為降低標記階段對用戶線程暫停的時間,單獨開辟一個線程進行可達性分析實現(xiàn)標記批狐,即可不影響用戶線程的正常運行。
使用場景
目前眾多收集器都使用了并發(fā)標記來減少停頓時間嚣艇,例如:CMS 收集器食零、G1 收集器、Shenandoah 收集器等贰谣。
二吱抚、可達性分析
并發(fā)標記線程進行標記時,用戶修改了某些對象引用導致對象引用圖狀結(jié)構(gòu)發(fā)生變更秘豹,會帶來以下兩種問題:
- 原本可回收對象標記為不可回收
雖然是錯誤的標記結(jié)果,但只是會產(chǎn)生 浮動垃圾 而已因痛,可在下次收集時再清理岸更。 - 原本不可回收對象標記為可回收
這是非常嚴重的錯誤,一定會帶來程序的錯誤谭企。
標記錯誤過程圖
為更好解釋標記錯誤的產(chǎn)生评肆,我們引入下面的過程圖解。
有關(guān)理論證明盹廷,當且僅當以下兩種條件滿足時會產(chǎn)生久橙,會產(chǎn)生誤標記白色的問題:
- 賦值器插入了一條或多條從黑色對象到白色對象的新引用
- 賦值器刪除了全部從灰色對象到白色對象的直接或間接引用
三淆衷、解決方案
只需要破壞誤標記條件其中之一,即可解決標記錯誤的問題祝拯,于是有兩種解決方案:增量更新、原始快照(SATB)鹰贵。
增量更新
增量更新要破壞第一個條件,當黑色對象插入新的指向白色對象的引用關(guān)系時籽前,就將這個新插入的引用記錄下來腊瑟,并發(fā)掃描結(jié)束后,再 將這些記錄的引用關(guān)系中黑色對象為根膘格,重新掃描一次财松。
可簡化理解為黑色對象一旦新插入指向白色對象的引用后,它就變?yōu)榛疑珜ο蟆?/p>
原始快照
原始快照要破壞第二個條件菜秦,當灰色對象要刪除指向白色對象的引用關(guān)系時舶掖,就將這個要刪除的引用記錄下來,并發(fā)掃描結(jié)束后主慰,再 將這些記錄的引用關(guān)系中灰色對象為根鲫售,重新掃描一次。CMS 使用此方式進行并發(fā)標記藐不。
可簡化理解為無論引用關(guān)系是否刪除秦效,都會按照剛開始掃描的那一刻的對象關(guān)系圖進行搜索,即給最初的關(guān)系圖進行了快照底扳。G1贡耽、Shenandoah 使用此方式進行并發(fā)標記。