一、CMS是如何收集垃圾的?
- 初始标记-并发标记-并发预处理-重新标记-并发清理
- 初始标记:用较短的STW时间,仅标记与root直接有引用关系的对象
- 并发标记:这阶段是不影响系统运行的,从初始标记的对象开始标记所有可达的对象
- 并发预处理:并发标记的时间内用户线程未挂起,还会有很多对象发生了变化,但接下来的重新标记阶段是需要STW的,所以进行一个追赶对象变化的预处理
- 重新标记:发生STW,时间取决于并发预处理
- 并发清理:不发生STW,将标记的清除,在这个阶段对象还会发生变化,可能产生垃圾,称为浮动垃圾
二、预处理如何执行的?
- 新生代:遍历新生代,看有哪些对象发生了变化
- 老年代:借助card table存储老年代对象发生的变化,扫一遍
三、CMS的缺点?
- 空间需要预留(一边处理用户线程,一边还要回收垃圾)
- 内存碎片问题(采用标记清除算法),解决要进行fullGC,会产生卡顿