G1和CMS的區別


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指向了DB, BD斷開。 此時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變成灰色即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM