一、垃圾回收器的概述
在軟體應用程序中,垃圾回收是一項重要的任務,它負責釋放內存中不再使用的不必要的、無用的對象,使其可用於更多的內存分配。CMS(Concurrent Mark Sweep)垃圾回收器是Java虛擬機中的一種高效垃圾回收器,它的目標是儘可能縮短垃圾回收暫停的時間,以達到更高的吞吐量和響應速度。
CMS在整個垃圾回收的過程中,在工作線程和GC線程之間共享任務,所以其特別適用於需要低停頓時間的應用程序。
二、CMS垃圾回收器的工作流程
CMS垃圾回收器的工作流程可以大致分為預處理、初始標記、並發標記、重新標記、並發清除五個階段。
1. 預處理:
CMS垃圾回收器在預處理階段將遍歷整個堆,首先對每個對象打上年齡標記,然後進行一輪初始標記。
2. 初始標記:
CMS垃圾回收器需要在當前工作線程的暫停時間內標記出所有的根對象,並跟蹤直接關聯到它們的對象。在這個階段,虛擬機暫停所有 Java 線程,是整個CMS垃圾回收的瓶頸所在。
3. 並發標記:
在這個階段,CMS垃圾回收器會對堆進行並發標記。由於用戶線程同時在運行,因此會有新的對象在此期間被分配。如果某個對象被分配,在GC線程還沒有標記到它的時候,這個對象就被稱為 「並發對象」。
4. 重新標記:
這個階段是CMS垃圾回收器的一個短暫暫停,它的目標是標記在並發標記期間新分配出來的對象。這樣做是為了確保垃圾的完整性,新創建的對象必須被準確地標記為垃圾。
5. 並發清除:
在完成所有標記後,清理不再使用的對象的空間就是下一個步驟。CMS回收器會並發執行這個步驟,並清理整個堆。
三、CMS垃圾回收器的實現
CMS垃圾收集器實現了CMS演算法中的各種細節,包括後重標記、並發清理、線程偏向、線程初始引用指針和立即重置。這些機製為CMS垃圾回收提供了擴展性和高並發性。為了實現上述操作,有以下幾個類:
1. CMS Collector: CMS垃圾回收器的核心類,負責執行整個垃圾回收的流程。
2. ConcurrentMarkSweepGeneration: 作為內存分配和垃圾回收的核心,這個類在JVM堆中表示CMS堆。
3. ReferenceProcessor: 引用處理器,負責處理垃圾回收時所使用的軟引用、弱引用和虛引用。
4. CMSParNewGen: 負責收集新生代垃圾,使用ParNew回收器收集新生代的垃圾。
public class CMSCollector { private ConcurrentMarkSweepGeneration cms; private ReferenceProcessor rp; private CMSParNewGen newGen; public CMSCollector(ConcurrentMarkSweepGeneration cms, ReferenceProcessor rp, CMSParNewGen newGen) { this.cms = cms; this.rp = rp; this.newGen = newGen; } public void collect() { // 預處理 cms.preprocess(); // 初始標記 cms.initialMark(); // 並發標記 cms.concurrentMark(rp); // 重新標記 cms.remark(); // 並發清理 cms.concurrentSweep(rp); // 丟棄並重新創建新生代 newGen.collect(); } }
四、CMS垃圾回收器的優缺點
優點:
1. CMS垃圾回收器的應用對系統資源佔用更少,使系統能夠快速、高效地回收垃圾。
2. CMS垃圾回收器能夠與應用程序並發執行,減少了對系統停頓時間的影響,提高了系統的可用性。
3. CMS垃圾回收器相對於其他垃圾回收器有更短的暫停時間,因為它可以在工作線程的暫停時間範圍內完成垃圾回收。
缺點:
1. CMS垃圾回收器會對CPU資源產生較高的消耗,這可能會影響系統的性能。
2. 因為CMS垃圾回收器使用並發演算法,所以需要更多的程序員時間來實現和維護。
3. 在進行GC期間,CMS垃圾回收器可能會因為受到線程運行狀態的影響,導致標記不準確。
五、結論
CMS垃圾回收器是Java虛擬機中一個高效的垃圾回收器,它採用並發標記清除的方式,可以在與用戶線程並發執行的情況下完成垃圾回收的工作。在處理大型應用程序時,CMS垃圾回收器比其他垃圾回收器具有更多的優勢。但是,同時也有一些缺點需要注意,因此開發人員需要根據應用程序的特點來選擇合適的垃圾回收器。
原創文章,作者:HJQEV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332174.html