Java面试题更新 2026-08-05

请描述Java虚拟机中CMS垃圾收集器的完整回收流程,包括各阶段的主要工作内容及特点。

技术原理JavaJVM

考察说明

考查对CMS垃圾收集器工作流程及并发特性的理解程度。

回答思路

  1. 【回答框架 1】CMS全称Concurrent Mark Sweep,目标是低停顿,适用于对响应时间敏感的应用。其整体流程分为初始标记、并发标记、并发预清理、重新标记、并发清除和并发重置六个阶段。
  2. 【回答框架 2】初始标记是STW的,只标记GC Roots直接可达的对象,停顿很短。并发标记阶段与用户线程并发执行,从已标记对象出发遍历对象图,标记所有可达对象,此阶段耗时较长但不停顿。
  3. 【回答框架 3】并发预清理阶段用于减轻重新标记的负担,处理并发标记期间因用户线程修改引用关系而产生的新对象,发现卡表脏数据。重新标记是STW的,暂停时间比初始标记长,但比并发标记短,用于修正并发期间的变动,采用增量更新算法确保正确性。
  4. 【回答框架 4】并发清除阶段与用户线程并发执行,清除不可达对象、回收内存空间。并发重置阶段重置内部数据结构,准备下次使用。整个过程只有初始标记和重新标记需要STW,因此停顿时间短且可控。
  5. 【关键点 1】CMS分为六个阶段,其中初始标记和重新标记是STW,其余阶段与用户线程并发执行。
  6. 【关键点 2】初始标记只标记GC Roots直接可达对象,停顿很短。
  7. 【关键点 3】并发标记阶段标记所有可达对象,与用户线程并发执行。
  8. 【关键点 4】重新标记阶段修正并发期间的变动,使用增量更新算法。
  9. 【关键点 5】CMS关注低停顿,但会产生内存碎片,且无法处理浮动垃圾。
  10. 【易错点 1】不能将CMS描述为完全无停顿,初始标记和重新标记均需要STW。
  11. 【易错点 2】CMS无法处理并发清除阶段产生的浮动垃圾,可能导致Concurrent Mode Failure。
  12. 【易错点 3】CMS采用标记-清除算法,会产生内存碎片,可能导致提前Full GC。