一. Concurrent Mark Sweep
看名字就知道,CMS是一款并发、使用标记-清除算法的gc, 存在着内存碎片化问题
CMS是针对老年代进行回收的GC。 以获取最小停顿时间为目的。
在一些对响应时间有很高要求的应用或网站中,用户程序不能有长时间的停顿,CMS 可以用于此场景。
二. CMS的执行过程
- 初始标记 Init-mark (STW 即 stop the world)
该阶段进行可达性分析,标记GC ROOT能直接关联到的对象. 间接关联的对象在下一阶段标记 - 并发标记 Concurrent-mark
该阶段和用户线程并发执行. 该阶段进行GC ROOT TRACING,在第一个阶段被暂停的线程重新开始运行。 由前阶段标记过的对象出发,所有可到达的对象都在本阶段中标记。 - 并发预处理 concurrent-preclean-start
与下一步的重标记的工作类似. 但为了GC的最短停顿时间, 因此工作尽可能多的在并发阶段完成来减少STW的时间.
此阶段标记从新生代晋升的对象、新分配到老年代的对象以及在并发阶段被修改了的对象。 - 重标记 Remark (STW)
暂停所有用户线程,重新扫描堆中的对象,进行可达性分析,标记活着的对象。
有了前面的基础,这个阶段的工作量被大大减轻,停顿时间因此也会减少。
注意这个阶段是多线程的。 - 并发清理 concurrent-sweep-start
用户线程被重新激活,同时清理那些无效的对象。 - 重置 concurrent-reset-start
CMS清除内部状态,为下次回收做准备。
网友评论