CMS 执行一次回收分为 4 个阶段:
1. 初始标记
会 Stop The World 停止工作线程, 标记 GC Roots(局部变量和类的静态变量) 引用的对象. 速度很快, 因为只标识 GC Root 引用的对象.
2. 并发标记
并发进行, 系统一边工作, 一边进行垃圾回收, 对系统的所有对象进行 GC Root 追踪, 看有没有最终被 GC Root 的对象引用, 这个过程很耗时. 但是不影响系统的工作, 系统工作期间会继续有对象进入老年代, 这些对象有可能变成垃圾或被引用, 在下一个阶段进行处理.
3. 重新标记
会 Stop The World, 这时对上个阶段产生的垃圾或者存活的对象再作一次标记, 这个阶段速度也很快.
4. 并发清理
这个阶段很耗时, 和系统并发运行, 不影响系统工作. 清理掉被标记的垃圾对象, 并进行对象移动整理, 减少内存碎片.
来源: http://www.jianshu.com/p/a66fa15cc64a