1.initial mark(初始标记):通过GC roots找到根对象,这个过程会STW(stop the world),由于根对象并不多,所以STW的时间不会长。
2.concurrent mark(并发标记):这个过程其他工作线程也在改变引用的指向,即一边进行垃圾标记一边又改变这引用指向,可能又经历了垃圾变成非垃圾,非垃圾变成垃圾(这个过程是耗时最长的,所以并发去标记,不影响工作线程,缩短了SERAL单线程清理的STW时间,自然就提高了效率),所以还有第三阶段的重新标记。
3.remark(重新标记):因为并发标记的过程,产生的垃圾也不会太多,虽然也是会STW(STW的原因是在标记的时候如果又产生指向改变,那就又陷入了这个过程,所以STW暂时让指向不变保证完全标记),但是重新标记不会耗时太多,到这阶段,就完成了标记工作。
4.concurrent sweep(并发清理阶段:在并发清理的过程中其实工作线程也在工作,也会产生垃圾,这部分垃圾成为浮动垃圾,这些个垃圾在这次是不能清理了,只有等下一次垃圾清理。
备注:CMS细分是六阶段;被清理的这些垃圾包括,线程栈变量、静态变量、常量池、JNI指针