CMS和G1垃圾回收流程區別
CMS流程
—>初始標記(只標記最根上的對象STW) —>並發標記(百分之八十時間) —>重新標記(STW 並發標記過程中錯標 重新標記) CMS和G1采用的三色標記,區別是CMS增量更新,G1采用的快照替換 —>並發清理(這個過程產生的垃圾叫浮動垃圾 只能等下一次CMS)
其中初始標記和重新標記會STW。
ps:並發清理時因為有浮動垃圾的存在,所以CMS不能等老年代全滿了才回收(回從年輕代過來浮動垃圾)
有一個參數in ni shou 哦 可 pan ci:老年代達到總空間多少的時候開始啟動回收進程。
有個版本是90% 如果業務負責,會很快填充到百分百,此時老年代滿了之后 最誇張的是會用s o單線程回收。
G1:引入了分區,物理上分區,邏輯上分代
分區回收:哪個區快滿了,可以動態的清掉
優先回收:花費時間少 垃圾比例高的Region(區)
每個區清空之后可以根據需要動態的指定為 伊甸區 老年代
G1垃圾回收器 新生代 survivor區edon區,老年代,等代的占比會自己動態的調整
CMS和G1三色標記算法區別
先看看什么是三色標記
三色標記應用於並發標記的場景:對象樹中哪個標過了 哪個沒有標 ,下一次回來,必須從現有的狀態繼續走。
黑:對象樹中 自己和子節點全部都標記過了
灰:自己標記過 子節點沒完全標記過
白:自己沒標記過
三色標記會出現漏標的問題
如果垃圾回收線程此時掃描對象樹的狀態是:A-B-D
等業務線程執行一斷時間后 此時 A指向了D和B, B和D斷開。 此時D不是垃圾,但是垃圾回收器以為D是垃圾(因為BD斷開,垃圾回收器不掃黑色A)
如圖:
CMS解決方案
業務線程A指向D的時候把A變成灰色(通過寫屏障),但在兩個垃圾回收線程並發標記的時候這個算法有個bug
m1垃圾回收正在標記A,已經標記完成屬性1 正在標記屬性2
m2業務線程把A屬性1指向白色對象D
m3垃圾回收線程把A標記成灰色
m1垃圾回收把屬性2標記完成,把A標記成黑色,結果D還是會漏標。
所以CMS在remark階段 會從頭掃一遍以解決這個問題(STW)
G1解決方案
SATB,把灰色對象指向白色對象引用消失的時候,把這個引用放到一個堆棧里面。
當垃圾回收線程回來的時候,檢查一個堆棧(有沒有 灰色指向白色引用消失的過程),找到D之后把D變成灰色即可