JVM垃圾回收器之CMS篇

CMS

1> 并行回收器-CMS

  • 对于 CMS 它关心的是系统的停顿时间,也就是获取最短回收停顿时间为目标。
  • CMS 是在 老年代 工作的垃圾回收器,使用的是 标记清除算法
  • 使用:-XX:+UseConcMarkSweepGC 来开启CMS

2> CMS垃圾回收步骤

image.png

  • 初始标记 STW
    • 标记根对象
  • 并发标记
    • 标记所有存活对象
  • 预清理(可关闭)
    • 清理前的的准备和控制停顿时间
    • 预测下一次新生代发生GC的时间 取中间时刻
    • 目的:尽量避免新生代GC和重新标记重叠执行。从而减少一次停顿时间
    • 可设置 -XX:+CMSPrecleaningEnabled 禁止预清理
  • 重新标记 STW
    • 这个阶段会扫 新生代 和 老年代
    • 修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
    • 重新标记阶段耗时比较长
      • 可设置 -XX:+CMSScavengeBeforeRemark ,在重新标记之前,先执行一次 youngGC
  • 并发清理
    • 真正的执行了清理操作
  • 并发重置
    • 并发重设状态等待下次CMS的触发

3> 劣势

  • 由于采用 标记清除算法 会产生大量的内存碎片
  • ⽆法处理浮动垃圾,程序在进⾏并发清除阶段⽤户线程所产⽣的新垃圾
  • 对cpu资源敏感
    • CMS有两个并发阶段:并发标记和并发清理。这两个阶段可以和用户线程并发执行,在并发阶段虽然不会导致用户线程停顿,但是因为占用了一部分CPU资源,如果在CPU资源不足的情况下应用会有明显的卡顿。

4> 部分调优指令

  • -XX:+UserCMSCompactAtFullCollection:指定GC后进行一次碎片整理
  • -XX:CMSFullGCsBeforeCompaction=n:指定执行多少次GC后,进行一次碎片整理
  • -XX:CMSSlnitiatiogOccupancyFraction:当老年代空间使用达到百分比时,会执行CMS。默认68
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享