CMS垃圾收集器详解:追求最短停顿时间

需积分: 0 0 下载量 147 浏览量 更新于2024-08-05 收藏 1.15MB PDF 举报
"CMS垃圾收集器是一种Java虚拟机的垃圾收集策略,主要针对老年代的内存回收,以缩短垃圾收集时的停顿时间为目标。CMS基于‘标记-清除’算法,适用于需要快速响应、CPU资源丰富的环境。" CMS收集器的工作流程包含多个阶段,分别是: 1. 初始标记(Stop the world):这是一个短暂的停顿阶段,CMS首先标记出所有GC Roots可以直接到达的对象。这一阶段可以并行化以减少停顿时间。 2. 并发标记:在这一阶段,CMS垃圾收集器与应用程序线程并发运行,遍历所有可达对象,这可能导致对象图发生变化。 3. 预清理(可被终止的预清理):这是一个可选阶段,用于减少下一次重新标记阶段的工作量,可能因系统资源限制而被取消。 4. 重新标记(Stop the world):由于并发标记期间对象状态可能变化,因此需要再次暂停所有线程,进行快速地重新标记,修正并发标记期间产生的错误标记。 5. 并发清理:这个阶段CMS垃圾收集器与应用程序线程并发执行,清理未被标记的对象,释放内存空间。 6. 并发重置:最后,CMS进行自我恢复,准备下一轮垃圾收集。 在应对内存碎片问题上,CMS提供了两个关键参数: - UseCMSCompactAtFullCollection:当进行Full GC时是否启用内存碎片整理。 - CMSFullGCsBeforeCompaction:设置多少次不压缩的Full GC后,执行一次带有压缩的Full GC。 CMS收集器虽然能提供较低的停顿时间,但牺牲了系统的整体吞吐量。因此,它更适合那些对响应时间敏感、可以接受一定程度CPU资源消耗的应用。 另一个与CMS相关的收集器是G1(Garbage-First)收集器,它的工作流程与CMS类似,但加入了区域划分和预测停顿时间的机制。G1的阶段包括初始标记、并发标记、最终标记和筛选回收,同样注重降低停顿时间。 在实际使用中,可以通过JVM启动参数`-XX:+UseConcMarkSweepGC`来启用CMS收集器。在配置CMS时,需要综合考虑应用的性能需求和资源限制,以达到最佳的垃圾回收效果。