备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 JVMGC 总结CMS常见面试题
0 0

海报分享

原创

总结CMS常见面试题

谈谈对CMS的认知?

CMS(concurrent mark sweep)在jdk1.5中已经开始使用了,2004年9月30日,JDK1.5发布。CMS设计的目标就是获取最低停顿时间(stop the world停顿时间),它是基于 标记-清除 算法实现的。常用的场景是互联网网站(对服务响应要求较高),它是一个老年代垃圾收集器,可以和 Serial 收集器, Parallel New 收集器配合使用。当并行模式(concurrent mode failure)失败时CMS会退化成 Serial Old .

CMS收集器的工作流程(步骤)是什么样的?

主要四个阶段

  • 初始标记:只标记和GC Roots能直连的对象,速度快,会发生(stop the world)
  • 并发标记:和应用线程并发执行,遍历 初始标记 阶段标记过的对象,标记这些对象的可达对象。
  • 重新标记:由于 并发标记 是和应用线程是并发执行的,所以有些标记过的对象发生了变化。这个过程比 初始标记 用时长,但是比 并发标记 阶段用时短。会发生(stop the world)
  • 并发清除:和应用线程一起运行。基于标记对象,直接清理对象。

CMS的缺点?

垃圾碎片问题

  • 原因:由于CMS采用的是 标记-清除 算法,所以不可避免会有内存碎片问题。
  • 解决:使用 -XX:+CMSFullGCsBeforeCompaction=n ,意思是在上次 CMS 并发 GC 执行过后,到底还要做多少 Full GC 才做压缩。默认是0,也就是说每次 CMS GC 顶不住了转入 Full GC 时都要压缩。

并发模式失败(concurrent mode failure)

  • 原因:CMS垃圾清理线程和应用线程是并发执行的,如果在清理过程中老年代空间不足不能容纳新对象。
  • 解决:使用 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 ,指定CMS对内存的占用率到60%时开始GC。

重新标记阶段时间过长

  • 解决:使用 -XX:+CMSScavengeBeforeRemark ,在执行 重新标记 之前,先做一次 Young GC ,目的在于较少年轻代对老年代的无效引用,降低 重新标记 的开销。

为什么配置了 CMS GC ,却触发了 Full GC ?

  • 大对象分配时,年轻代放不下,直接去老年代,结果老年代也放不下。
  • 内存碎片问题(使用 标记-清除 算法的缺点)
  • CMS GC 失败(concurrent mode failure导致)
  • jmap -histo 人为执行了命令
wx.jpg

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。