专栏首页JVMGC总结CMS常见面试题
原创

总结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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MyBatis 常见面试题总结

    1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建stat...

    江南一点雨
  • STL总结与常见面试题

    为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL...

    小林C语言
  • STL 总结与常见面试题

    为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL...

    C语言与CPP编程
  • 常见的面试问题总结

    ​ 执行环境是JavaScript中最为重要的一个概念。执行函数定义了变量或函数有权访问的其它数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象...

    Tz一号
  • 2020年,MyBatis常见面试题总结

    Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,...

    Java码农那些事
  • 大数据常见面试题总结

    很多学员在面试的时候都会问到老师,常见的面试题有哪些。今天老师根据往届学员的面试反馈,整理了常见的一些面试题目,希望可以帮助到需要的同学。

    加米谷大数据
  • PHP常见字符串面试题总结

    由于此类问文章首发地址为该微信公众号,后期会不断更新,微信公众号不便于更新,可以点击左下角的阅读原文按钮,即可查看最新版本。

    A梦多啦A
  • STL总结与常见面试题+资料

    为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL...

    C语言与CPP编程
  • Mybatis常见面试题总结及答案

    1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建stat...

    挨踢小子部落阁
  • Kubernetes 常见的面试题总结分享

    etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(...

    kubernetes中文社区
  • Java常见面试题汇总

     动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 今天的主题我们来谈谈求职,每个程序员的生涯总有几次求职经历,对于求职...

    动力节点Java培训
  • Vue常见面试题汇总

    MVVM 是 Model-View-ViewModel 的缩写。mvvm 是一种设计思想。Model 层代表数据模型,也可以在 Model 中定义数据修改和操作...

    物流IT圈
  • 测试常见面试的总结(二)

    Meccer
  • 测试常见面试的总结(一)

    30.公司用到第三方服务,出问题,沟通第三方,第三方不承认,这时候日志不显示错误,应怎么处理

    Meccer
  • SpringMVC常见面试题总结(超详细回答)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    程序员小强
  • 24道Mybatis常见面试题总结及答案!

    第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

    用户5546570
  • Spring常见面试题总结(超详细回答)

    Spring常见面试题总结(超详细回答) ...

    Java架构师必看
  • Spring常见面试题总结(超详细回答)

    Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求...

    全栈程序员站长
  • PHP面试常见问题汇总

    1、PHP抽象类和接口的区别? a)接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。 b)...

    苦咖啡

扫码关注云+社区

领取腾讯云代金券