Java8 的 G1 垃圾回收器相對于之前的 CMS 有什么特別的呢?
本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。
CMS
CMS 垃圾回收器,全稱 Concurrent Mark Sweep 并發標記-清除,從名字上面我們也可以看出這個垃圾回收器是基于標記清除算法實現的。首先"并發"表示 GC 線程可以和用戶線程并發執行,同時既然是標記-清除算法,說明這個垃圾回收器會產生很多碎片,這是標記-清除算法的缺點。同時 CMS 是作用于老年代的,老年代的垃圾回收頻率相對年輕代會低一點。
CMS 的垃圾回收有四個過程
- 初始標記:
- 并發標記:
- 重新標記:
- 并發清除:
初始標記的時候是一個 STW (stop the world)的過程,所有的用戶線程都會停止,這個時候只是標記一下 GC Roots 能直接達到的對象,由于只是標記一層所以整個速度相對會比較快。
并發標記是一個 GC Roots 掃描的過程,會掃描整個鏈路標記可以回收的對象;由于整個的鏈路會比較長,所以相對會耗時久一點,不過由于這個過程是并發的,所以對用戶線程運行是沒有影響的。
重新標記顧名思義是一個再次標記的過程,同時也是會 STW,之所以會有這個重新標記的過程,是因為在上一步并發標記的過程中,用戶線程依舊在運行,所以對象的引用關系會發生變化同時在運行的時候也會產生新的垃圾。這里只會標記在上一步有發生變化的對象,雖然會 STW 不過速度也較快。
并發清除是最后一個階段,這個階段由于需要清除之前掃描的所有垃圾對象,所以會相對比較耗時,不過這個階段是可以并發進行的所以對用戶線程的運行不會有影響。
經過上面的四個過程就完成了一次完整的 GC,前面我們提到整個 CMS 垃圾回收器是基于標記-清除算法的,先通過三個過程標記出需要清理的對象,然后再進行清理。整個過程中初始標記和重新標記會觸發 STW,其他兩個階段是并發進行的。標記-清除算法會產生內存碎片,所以不適合需要頻繁回收的年輕代,所以只適合老年代。產生碎片是 CMS 的缺點,并發是 CMS 的優點,畢竟任何一個收集器都會有優缺點。
G1
前面我們聊完了 CMS,接下來我們聊一下 G1,G1 全稱 Garbage First,在講 G1 垃圾回收器的細節之前,我們首先要知道的是 G1 對整個堆的空間做了重新的定義。G1 中的老年代和年輕代已經不再是物理隔離的了,而是邏輯隔離。在 G1 中整個堆空間被分成了一個個相同大小的 Region 塊,多個 Region 塊在邏輯上組成了年輕代和老年代。
這樣做的目的是因為在進行垃圾回收的時候不需要進行整個堆空間的掃描,同時可以根據指定停頓時間來進行垃圾回收。G1 會將每個 Region 的回收成本進行量化,從而達到一個成本控制,可以在限定的停頓時間內完成回收,這是 G1 的最大的特點。
G1 回收也分為四個過程:
- 初始標記:初始標記與 CMS 也是只掃描 GC Roots 直達的對象,這階段同樣也要 STW,不過時間也很短;
- 并發標記:從 GC Roots 開始堆中對象進行可達性分析,找出存活的對象,這個階段耗時較長,但是可以與用戶程序并發執行;
- 最終標記:最終標記和 CMS 的重新標記的思路一直,也是為了修正并發標記期間由于用戶程序并發運行而導致標記產生變動的那一部分對象,不過不同的是 G1 會將這段時間對象變化記錄在線程 Remembered Set Logs 里面,最終標記階段需要把 Remembered Set Logs 的數據合并到 Remembered Set 中,這個階段需要停頓線程,不過是可并行執行;
- 篩選回收:最后一步篩選回收是 G1 與 CMS 最大的不同之處,G1 首先會對各個需要回收的 Region 代價進行量化和排序,在結合用戶所期望的 GC 停頓時間來制定回收計劃,通過-XX:MaxGCPauseMillis 參數來指定期望的回收時間。這個階段也可以做到與用戶程序一起并發執行,但是因為只回收一部分 Region,時間是用戶可控制的,而且停頓用戶線程將大幅提高收集效率。
上面提到了一個 Remembered Set 記憶集,是用來記錄對象引用的,在并發標記的時候有對象引用發生變更的時候會記錄到這里,等到最終標記的時候進行修正。整體上來看 G1 采用的是標記-整理的算法來進行垃圾回收,也不會像 CMS 那樣會產生內容碎片,所以 G1 同時可以進行年輕代和老年代的垃圾回收,相比 CMS 會更靈活一點,而且也因為 G1 將內存劃分成 Region 了,也不會造成復制算法帶來的空間浪費的問題。
總結
首先CMS 和 G1 都是并發和分代的垃圾回收器,并且都是低延遲的;CMS 是基于標記-清除算法的,只適合在年輕代使用,不可預測停頓時間,同時年輕代和老年代是物理隔離的。G1 是基于標記-整理的高吞吐,可預測停頓時間的垃圾回收器,可以同時使用在年輕代和老年代,同時年輕代和老年代是邏輯隔離的。
特點 | G1 | CMS |
---|---|---|
算法 | 標記-整理 | 標記-清除 |
年輕代和老年代隔離方式 | 邏輯隔離 | 物理隔離 |
停頓時間可預測行 | 是 | 否 |
并發和分代 | 支持 | 支持 |
吞吐量 | 高 | 低 |
使用場景 | 年輕代,老年代 | 年輕代 |
低延時 | 是 | 是 |