CMS垃圾回收器

刚才转了关于cms回收期的文章,但是还是不太理解,又重新读了一下书,终于懂了,分享一下,强迫症太可怕,一点了,不记录博客睡不着


与parallelGC和paralleloldGC不同,CMS回收期主要关注于系统停顿时间,cms cocurrent mark sweep的缩写,意味并发标记清除,从名称上就可以得知,它使用的是标记清楚算法,同时他又是一个使用多线程并行回收的垃圾回收器


CMS的主要工作步骤


初始标记(标记根对象)


并发标记 (标记所有对象)


预清理(清理前准备及控制停顿时间)


重新标记(修正并发标记数据)


并发清理(垃圾回收)


并发重置



其中出事标记和重新标记是独占系统资源的,而预清理,并发标记,并发清楚和并发重置是可以和用户线程一起执行的,因此从整体上说,cms不是独占式的,它可以在应用程序运行过程中进行垃圾回收


根据并发标记算法,初始标记、并发标记和重新标记都是为了标记出需要回收的对象,并发清理则是在标记完成后,正式回收垃圾对象。

并发重置是指在垃圾回收完成后,重新初始化CMS数据,为下一次垃圾回收做准备。并发标记、并发清理和并发重置都i可以和应用线程一起执行


在整个cms回收过程中,默认情况下,并发标记之后,会有一个预清理的操作,预清理是并发的,为了为正式清理做准备和检查之外,预清理还会尝试控制一次停顿时间,由于重新标记是独占cpu资源的,如果新生代发生gc后,立即触发一次重新标记,那么一次停顿时间可能很长,为了避免这种情况,预处理时,会刻意等待一侧新生代gc发生,然后根据历史性能数据,预计下一次新生代gc可能发生的时间,然后再当前和预测时间的中间时刻,进行重新标记,这样从最大程度上避免新生代和重新标记重合,尽可能减少一次停顿时间



<think>嗯,用户问的是Java的CMS垃圾回收器,我需要先回忆一下CMS的基本信息。CMS全称是Concurrent Mark Sweep,属于老年代的垃圾回收器,对吧?它的目标主要是减少停顿时间,适合对延迟敏感的应用。那CMS的工作流程是怎样的呢?我记得分为几个阶段,比如初始标记、并发标记、重新标记,还有并发清除这些步骤。初始标记应该很快,只是标记GC Roots直接关联的对象,然后并发标记是和用户线程一起运行的,这样减少停顿。然后是重新标记阶段,用来处理并发期间变化的对象,最后并发清除回收垃圾。 用户可能想知道CMS的优点和缺点。优点应该是低停顿,适合需要快速响应的应用。但缺点呢?比如内存碎片问题,因为CMS是基于标记-清除算法的,会产生碎片,可能导致大对象分配失败触发Full GC。还有就是并发阶段消耗CPU资源,可能会影响吞吐量。另外,CMS需要预留空间给并发收集期间新产生的对象,如果预留不够就会导致并发模式失败,转而使用Serial Old收集器,这样停顿时间反而更长。 可能用户在使用CMS时遇到了问题,或者在选择GC策略时需要权衡。比如,CMS在Java 8之后已经被标记为废弃,G1成为了默认的老年代收集器,但有些旧系统可能还在用CMS。用户可能想了解如何配置CMS的参数,比如-XX:+UseConcMarkSweepGC来启用,或者设置初始标记的阈值,调整并发线程数等。 另外,CMS的三色标记法可能涉及到漏标的问题,通过写屏障来记录并发期间的引用变化,确保最终标记的准确性。这部分可能需要详细解释,但用户可能更关注实际应用,所以应该简明扼要。 还需要提到CMS的几个关键参数,比如CMSInitiatingOccupancyFraction,控制老年代占用多少时开始GC,默认是68%。还有-XX:+CMSScavengeBeforeRemark,是否在重新标记前进行一次Young GC,减少重新标记的时间。 用户可能没有提到CMS的替代方案,比如G1,是否需要简单对比一下?不过问题集中在CMS本身,可能不需要展开。但可以作为相关问题提出来。 总结回答的结构:先介绍CMS是什么,适用场景,工作流程的各个阶段,优缺点,关键参数,以及废弃状态。然后相关问题应该包括工作流程细节、替代方案、参数调优、内存碎片处理,以及废弃原因等。</think>CMS(Concurrent Mark Sweep)垃圾回收器是Java早期版本中用于老年代的低停顿垃圾回收器,其核心目标是通过并发执行减少垃圾回收过程中的停顿时间。以下是关键要点: ### 核心流程 1. **初始标记(Initial Mark)** 仅标记GC Roots直接关联的对象(速度快,需Stop-The-World)。 2. **并发标记(Concurrent Mark)** 与用户线程并发执行,遍历对象引用链(无需停顿)。 3. **重新标记(Remark)** 修正并发标记期间因用户线程运行导致的引用变化(需短暂停顿)。 4. **并发清除(Concurrent Sweep)** 并发回收垃圾对象(无需停顿)。 ### 优缺点 - **优点**:低停顿,适合高响应场景(如Web服务)。 - **缺点**: - 内存碎片化(标记-清除算法导致)。 - 并发阶段占用CPU资源。 - **并发模式失败**(Concurrent Mode Failure)风险:若老年代空间不足,会触发Full GC并退化为Serial Old收集器。 ### 关键参数 - `-XX:+UseConcMarkSweepGC`:启用CMS(JDK9前)。 - `-XX:CMSInitiatingOccupancyFraction=68`:设置老年代占用阈值触发GC(默认68%)。 - `-XX:+CMSScavengeBeforeRemark`:在重新标记前强制执行Young GC(减少重标记时间)。 ### 注意 CMS在JDK9中被废弃,JDK14后移除,推荐使用G1或ZGC等新一代回收器。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值