深入理解 JVM 垃圾收集器 CMS:原理、优缺点及应用场景
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的垃圾收集器,它是一种基于'标记-清除'算法的收集器。它的主要原理是:
-
初始标记(Initial Mark):首先,CMS收集器会暂停所有的应用线程,标记所有GC Roots能直接关联到的对象,进行一次'Stop The World'暂停。
-
并发标记(Concurrent Mark):在初始标记结束之后,CMS收集器会启动与应用线程并发执行的标记过程,标记所有的存活对象,这个过程是与应用线程并发执行的,不会在整个过程中停顿应用线程。
-
重新标记(Remark):在并发标记阶段结束之后,CMS收集器会暂停所有的应用线程,重新扫描所有的被标记的对象,标记那些在并发标记过程中因为应用线程的并发执行而产生变化的对象。
-
并发清除(Concurrent Sweep):在重新标记阶段结束之后,CMS收集器会启动与应用线程并发执行的垃圾清除过程,清除所有已经死亡的对象,这个过程也是与应用线程并发执行的,不会在整个过程中停顿应用线程。
优点:
-
垃圾回收的并发处理能力非常强,几乎不需要停顿用户线程。
-
在回收内存时,会尽可能地保留尽量多的空间,尽量减少后续的垃圾回收。
-
适用于对响应时间有要求的应用场景。
缺点:
-
由于采用了'标记-清除'算法,会产生大量的碎片,对于大对象的分配可能会出现失败,导致产生更多的 Full GC。
-
并发执行会消耗一定的系统资源,对系统的吞吐量也会有一定的影响。
-
由于在回收过程中需要与应用线程并发执行,因此CMS收集器在处理高并发和大量垃圾的情况下,可能会导致CPU占用率过高,对应用的性能产生影响。
原文地址: https://www.cveoy.top/t/topic/n6W4 著作权归作者所有。请勿转载和采集!