JAVA垃圾回收器-CMS

70 阅读2分钟

CMS(Concurrent Mark-Sweep)垃圾回收器是一种基于标记-清除算法实现的垃圾回收器,其主要目标是降低应用程序在垃圾回收过程中的停顿时间。为了实现这个目标,CMS牺牲了一部分吞吐量。因此,CMS垃圾回收器非常适合对服务器响应速度有较高要求的应用。

CMS垃圾回收器的回收过程主要分为以下七个步骤:

  1. 初始标记(Initial Mark):此阶段需要暂停应用程序(Stop-The-World),标记GC Roots能直接关联到的对象。这个阶段的停顿时间通常很短。
  2. 并发标记(Concurrent Mark):在此阶段,应用程序的线程和垃圾回收器线程并发执行,垃圾回收器线程标记从GC Roots开始可达的所有对象。由于应用程序线程仍在运行,所以可能会产生新的垃圾。
  3. 并发预清理(Concurrent Preclean):此阶段,垃圾回收器线程尝试清理部分不再需要的对象,以减轻后续阶段的负担。
  4. 可中断预清理(Abortable Preclean):如果并发预清理阶段时间过长,可能会在这个阶段被中断,以便尽快恢复应用程序的执行。
  5. 重新标记(Remark):此阶段需要再次暂停应用程序,处理在并发标记阶段产生的新的垃圾,以及解决跨代引用问题。此阶段的停顿时间可能比初始标记阶段稍长。
  6. 并发清除(Concurrent Sweep):在此阶段,垃圾回收器线程清理不再需要的对象,释放内存空间。
  7. 重置(Reset):重置CMS垃圾回收器的内部状态,为下一次垃圾回收做准备。

需要注意的是,CMS垃圾回收器不会整理、压缩堆空间,因此在长期运行过程中,可能会出现内存碎片问题。为了解决这个问题,CMS垃圾回收器提供了-XX:+UseCMSCompactAtFullCollection和-XX:CMSFullGCsBeforeCompaction等参数,用于在特定条件下触发堆空间的整理和压缩。

总的来说,CMS垃圾回收器在减少停顿时间方面表现优异,但在处理内存碎片和吞吐量方面可能存在一些问题。在选择使用CMS垃圾回收器时,需要根据应用的具体需求和场景进行权衡。