CMS

136 阅读1分钟

一、CMS是如何收集垃圾的?

  1. 初始标记-并发标记-并发预处理-重新标记-并发清理
  2. 初始标记:用较短的STW时间,仅标记与root直接有引用关系的对象
  3. 并发标记:这阶段是不影响系统运行的,从初始标记的对象开始标记所有可达的对象
  4. 并发预处理:并发标记的时间内用户线程未挂起,还会有很多对象发生了变化,但接下来的重新标记阶段是需要STW的,所以进行一个追赶对象变化的预处理
  5. 重新标记:发生STW,时间取决于并发预处理
  6. 并发清理:不发生STW,将标记的清除,在这个阶段对象还会发生变化,可能产生垃圾,称为浮动垃圾

二、预处理如何执行的?

  1. 新生代:遍历新生代,看有哪些对象发生了变化
  2. 老年代:借助card table存储老年代对象发生的变化,扫一遍

三、CMS的缺点?

  1. 空间需要预留(一边处理用户线程,一边还要回收垃圾)
  2. 内存碎片问题(采用标记清除算法),解决要进行fullGC,会产生卡顿