1. 程式人生 > 其它 >CMSGC-STW-GCRoots-安全點(區)-三色標記

CMSGC-STW-GCRoots-安全點(區)-三色標記

CMS收集器的特點:追求最短的停頓時間。

CMS-Concurrent Mark Sweep 併發 標記 清除

標記清除:標記處需要回收的物件,標記完成後統一回收所有被標記的物件。

標記複製:將記憶體分為兩塊, 每次用一塊。當一塊記憶體用完時,將活著的物件複製到另一塊上。

標記整理:讓存活的物件整理到一端,清除掉死物件。

  • CMS平時用標記清除,碎片多了用標記整理。

CMS四個步驟

  1. 初始標記

在正常執行的時候如果要GC了,要找一個安全點停下來。安全點是物件引用關係不會發生變化的點。

如果執行緒5正在休眠,他的程式碼沒有執行,這裡要引入安全區的概念。安全區是在這個程式碼區域之內,物件引用關係都不會發生變化。當執行緒5想從安全區出來,要看初始標記有沒有結束。

初始標記會STW,業務程式碼都不會跑。初始標記會標記GC ROOTS。GC ROOTS是我們進行可達性分析時的找到的根節點,從根節點出發,他們引用的物件就是存活。

GC ROOTS:

  • 虛擬機器棧引用的物件

  • NATIVE棧引用的物件

  • 類靜態屬性引用的物件

  • 常量引用的物件

  • synchronized鎖引用的物件

  1. 併發標記

這個過程裡使用者執行緒和標記執行緒併發執行,這時用到三色標記法,三色是黑灰白,黑色表示物件已經被垃圾收集器訪問過,且所有引用也被掃描過,他是安全存活的。灰色也被訪問過,但是物件上至少存在一個引用沒有被掃描過。白色表示沒有被訪問過。

但是因為使用者執行緒在這個過程中可以改變物件的引用關係。

比如,引用消失:有一個已經被標記為黑色的物件,他的引用又斷掉了,這個叫做浮動垃圾,下次再回收。

還有就是新の引用:有一個已經被標記為黑色的物件,他不會再被掃描了,當他又建立新的引用時,就做一個記錄,不要收集他。

在掃描2的引用時,2與3的引用斷了,但是1又與3建立引用。

CMS的解決方法:將1再變為灰色節點。(增量更新)

G1的解決方法:雖然引用斷了,但是把刪除的引用記錄下來,之後再按原來的快照掃描一次。

  1. 重新標記

重新標記過程2中變化了的引用關係,這時候STW。

  1. 併發清除

清理垃圾。

Re