CMS(Concurrent Mark-Sweep)收集器是Java虚拟机中的一种垃圾收集器,属于老年代的收集器,采用的是多线程标记清除算法。与传统的Serial、Parallel收集器不同,CMS主要关注减小垃圾回收的停顿时间,尤其是减小Full GC的停顿时间。
以下是CMS收集器的主要特点和运作过程:
特点:
- 并发标记: CMS采用并发标记算法,允许垃圾收集线程与用户线程同时执行。这意味着在标记阶段,垃圾收集线程会和用户线程并发执行,减小了停顿时间。
- 低停顿时间: CMS致力于减小垃圾收集的停顿时间,特别是降低Full GC的停顿时间。尽管并发标记可以减小标记阶段的停顿,但为了确保回收效果,仍然需要在清除阶段暂停所有用户线程。
- 基于“标记-清除”算法: CMS收集器的算法基于标记清除,即首先标记出需要回收的对象,然后清除这些对象。与其他收集器不同,CMS没有移动对象,因此不会产生内存碎片问题。
运作过程:
- 初始标记(Initial Mark): 初始标记阶段是短暂的暂停,用于标记根对象,并标记直接与根对象有关的对象。这个阶段会引起短暂的停顿。
- 并发标记(Concurrent Mark): 在并发标记阶段,CMS会通过多线程对堆进行标记。这个阶段的主要目标是标记所有存活的对象,同时允许用户线程继续运行。
- 重新标记(Remark): 重新标记阶段是为了标记在并发标记阶段发生变化的对象。这个阶段会引起短暂的停顿。
- 并发清除(Concurrent Sweep): 在并发清除阶段,CMS会通过多线程清除标记为垃圾的对象。这个阶段允许用户线程继续执行。
需要注意的是,由于CMS并发执行,可能会发生一些附加的处理,比如并发标记阶段用户线程继续分配新的对象,因此可能在垃圾收集的同时有新的对象产生。此外,CMS对CPU资源敏感,如果并发线程不足,可能导致垃圾收集效率下降。
Was this helpful?
0 / 0