CMS 收集器执行过程分为 5 个阶段:
- Initial Mark(Stop the World Event)
暂停较短时间,标记可达对象。 - Concurrent Marking
应用不暂停,从 GC root 开始标记可达对象。 - Remark(Stop the World Event)
查找在并发标记过程中遗漏的对象。 - Concurrent Sweep
应用不暂停,清除不可达对象。 - Resetting
为下一次收集做准备。
最初堆中 eden,survivor,old 都是空的。
当 young GC 触发,存活的对象将从 eden 和 survivor 拷贝到另一个 survivor ,到达年龄阈值的对象晋升到 old 。
young GC 完成后,eden 和一个 survivor 被清空。
当 old 到达一定容量触发 CMS 。
1) 首先进行 Initial Mark 阶段,标记出可达对象。
2) 短暂暂停之后,进入 Concurrent Marking 阶段,应用程序继续执行,CMS 同时找到可达的对象。
3) 在 Remark 阶段,找到并发标记期间丢失的对象。
4) 进入 Concurrent Sweep 阶段,释放掉未被标记的对象。
5) 释放之后,进入 Resetting 阶段,一次 CMS GC 完成。