JVM CMS垃圾收集器

JVM CMS垃圾收集器是一种以获取最短回收停顿时间为目标的收集器,它使用了一种基于“标记-清除”算法实现的垃圾回收机制,又被称为 Concurrent Mark Sweep(CMS)收集器。

CMS收集器的工作过程可以分为以下几个阶段:

初始标记阶段(Initial Mark):标记根对象(根对象包括:虚拟机栈、本地方法栈、程序计数器等),以及直接与根对象有关联的对象,这个阶段的停顿时间比较短,但是需要“Stop The World”暂停所有应用线程。

并发标记阶段(Concurrent Mark):从初始标记阶段标记的对象继续向下遍历标记,标记过程和应用程序是并发的。此阶段由于要和应用线程一起抢占CPU资源,所以比较耗费系统的性能。

重新标记阶段(Remark):在并发标记过程中,由于用户线程和并发标记线程的交互,需要重新扫描堆,来确定是否有新增的对象需要标记,这个阶段的停顿时间也比较短。

并发清除阶段(Concurrent Sweep):清除未被标记的对象。这个阶段和应用线程是并发执行的。

CMS收集器的主要优点是垃圾回收时停顿时间短,基本上不影响应用程序的响应时间,适用于一些对垃圾回收时间有严格要求的应用场景。但是,由于采用了“标记-清除”算法,CMS收集器在回收完垃圾后,会留下大量的内存碎片,这可能会导致后续的内存分配失败。

此外,由于CMS收集器要与应用程序线程抢占CPU资源,所以在高并发场景下,CMS收集器的性能表现并不理想。此外,CMS收集器还存在着无法处理浮动垃圾的问题。