1. 程式人生 > 實用技巧 >CMS(Concurrent-Mark_Sweep)垃圾回收器的工作原理

CMS(Concurrent-Mark_Sweep)垃圾回收器的工作原理

CMS(Concurrent-Mark_Sweep)垃圾回收器的工作原理

簡介:

對於許多應用程式而言,在程式執行時的吞吐量不如快速響應時間那麼重要,尤其是在網際網路站或者B/S系統的服務端,這類應用尤其使用者的體驗感,中間出現停頓的時間越短越好,CMS垃圾收集器應運而生,它在JDK1.5時作為HotSpot JVM的一個預設的內建垃圾收集器。
CMS的特點是低延遲,很適合於與使用者互動的應用。這款垃圾收集器是一第一款真正意義上的併發垃圾回收器,它使用的是標記-清除演算法,所以也會有"stop the world"時間,但是時間會很短。

工作流程

在這裡插入圖片描述

初始標記:

初始標記時要停止所有使用者的執行緒,會進入"stop the world"時間,這時僅僅標記與GCRoots直接相連的物件(假設為集合A),所以初始標記的時間會很短。

併發標記:

此時標記的是與集合A直接或間接相連的物件(假設為集合B),躍然併發標記的時間較長,時長大約比初始標記大一個數量級,但是,此時是與使用者程式併發執行的,並不會出現"stop the world"情況。

重新標記:

因併發標記時使用者的執行緒還在執行,此時會產生新的連線物件(假設為集合C),重新標記就是標記集合C的物件。那麼為了防止重新標記過程產生新的物件,所以此時要停止所有使用者的執行緒,從而進入"stop the world"時間,此過程的用時也很短。

併發清除:

重新標記後,所以確定是垃圾的物件(假設為集合D),隨後垃圾回收器會將集合D清除掉。並不會移動物件,所以此過程是可以和使用者執行緒併發執行的。