MST
星途 面试题库

面试题:Java并发标记清理回收的基本流程

请简述Java并发标记清理回收(Concurrent Mark - Sweep, CMS)的基本工作流程,包括标记阶段和清理阶段分别做了什么。
27.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 初始标记(Initial Mark)

  • 操作:暂停所有用户线程(STW,Stop - The - World),标记出所有与GC Roots直接相连的对象。这个阶段速度很快,因为只是简单标记GC Roots直接关联的对象。
  • 目的:为后续并发标记确定起始点,缩短STW时间。

2. 并发标记(Concurrent Mark)

  • 操作:与用户线程并发执行,从初始标记阶段标记出的GC Roots直接相连对象开始,遍历整个对象图,标记出所有可达对象。
  • 目的:标记出所有在堆中存活的对象,为清理阶段做准备,由于是并发执行,尽量减少对应用程序性能的影响。

3. 重新标记(Remark)

  • 操作:暂停所有用户线程(STW),因为在并发标记过程中,用户线程可能改变对象的引用关系,重新标记用于修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。这个阶段时间比初始标记稍长,但远比并发标记短。
  • 目的:确保标记的准确性,避免漏标对象。

4. 并发清理(Concurrent Sweep)

  • 操作:与用户线程并发执行,清理掉那些在标记阶段被标记为不可达的对象所占用的内存空间。
  • 目的:回收垃圾对象占用的内存,让内存可再次被使用,并发执行以减少对应用程序的影响。

5. 并发重置(Concurrent Reset)

  • 操作:与用户线程并发执行,重置CMS收集器的数据结构,为下一次垃圾收集做准备。
  • 目的:为下一轮GC循环做准备工作,清理本次GC过程中的一些临时数据等,以便重复使用收集器。