Java 面试题
目录

Java 虚拟机 (JVM) 中 CMS 收集器的执行过程是什么?

· 约 2 分钟读完 · 第 134 / 274 章

推荐答案

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的垃圾收集器。它的执行过程主要分为以下几个阶段:

  1. 初始标记(Initial Mark):标记 GC Roots 能直接关联到的对象,速度很快,需要暂停所有工作线程(Stop The World)。
  2. 并发标记(Concurrent Mark):从 GC Roots 开始对堆中的对象进行可达性分析,找出存活对象。这个过程是与用户线程并发执行的。
  3. 重新标记(Remark):修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。这个阶段需要暂停所有工作线程(Stop The World)。
  4. 并发清除(Concurrent Sweep):清除未被标记的对象,回收内存空间。这个过程是与用户线程并发执行的。

本题详细解读

1. 初始标记(Initial Mark)

初始标记阶段是 CMS 收集器的第一个阶段,主要任务是标记 GC Roots 能直接关联到的对象。由于只需要标记直接关联的对象,因此这个阶段的速度非常快。但是,这个阶段需要暂停所有的工作线程(Stop The World),以确保标记的准确性。

2. 并发标记(Concurrent Mark)

并发标记阶段是 CMS 收集器的核心阶段之一。在这个阶段,JVM 会从 GC Roots 开始,对堆中的对象进行可达性分析,找出所有存活的对象。由于这个阶段是与用户线程并发执行的,因此不会导致应用程序的长时间停顿。然而,由于用户线程在并发标记期间可能会修改对象的引用关系,因此需要后续的重新标记阶段来修正这些变动。

3. 重新标记(Remark)

重新标记阶段是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。这个阶段需要暂停所有工作线程(Stop The World),以确保标记的准确性。虽然这个阶段会导致短暂的停顿,但由于只需要修正并发标记期间的变动,因此停顿时间通常较短。

4. 并发清除(Concurrent Sweep)

并发清除阶段是 CMS 收集器的最后一个阶段。在这个阶段,JVM 会清除未被标记的对象,并回收它们占用的内存空间。这个过程是与用户线程并发执行的,因此不会导致应用程序的长时间停顿。由于 CMS 收集器不会对内存进行压缩,因此可能会导致内存碎片问题,进而影响后续的内存分配效率。

通过以上四个阶段的执行,CMS 收集器能够在保证较短停顿时间的前提下,高效地进行垃圾回收。