【拥抱大厂系列】面试官100%会严刑拷打的 CMS 垃圾回收器,下次面试就拿这篇文章怼回去!

这里跟你们讲个面试的最多见的垃圾回收器的问题,我跟大伙说,你不用怀疑,CMS垃圾回收器必定是最多见的问题,只要问到了Java虚拟机,面试官巴不得就问你CMS,固然还有就是G1这个垃圾回收器了,因此,关于这个垃圾回收器的细节问题,必定要掌握好,只要掌握到位,那么必定可让面试官满意。git

可是,说句糟心的话,运气很差,面试官就是不对眼,也是没有办法的事情,只能认栽,自我感受再良好,也只是自我感受,在面试官内心,你就是渣渣!!!github

好了,下面咱们开始面试环节,这篇文章想换一种方式,咱们列举一些面试常见的问题,而后再来回答这些问题。面试

正文

这个春天,由于疫情的缘由,全部的面试都是线上远程面试的,因此,若是运气好,你能够看到面试官的脸,若是运气很差,你能够只能被面试官看到你紧张的样子,而你,看到的只是黑屏,哈哈!算法

这就是最真实的场景!并发

但是,并无面试官的身影,只有一次又一次的毒打!!网站

点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾讯等大厂offer。

小伙子,你说一下 CMS 垃圾回收器吧!

这个题目一来,吓出一身冷汗,差点就没有复习这个CMS,还好昨晚抱佛脚看了一下哈。spa

因而我。。。一顿操做猛如虎。线程

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是基于“标记-清除”算法实现的,而且常见的应用场景是互联网站或者B/S系统的服务端上的Java应用3d

结果就一紧张就记得这么多,面试官确定不满意了,这个时候,面试官的常规操做是,继续严刑拷打,他想,你可能忘记了,我来提醒提醒你!code

CMS收集器工做的整个流程是怎么样的,你能给我讲讲吗?

这个时候,面试官还会安慰你说不用紧张,可是,安慰归安慰,最后挂不挂但是另外一回事。

因而,我又开始回答问题。

CMS 处理过程有七个步骤:

  • 初始标记,会致使stw;
  • 并发标记,与用户线程同时运行;
  • 预清理,与用户线程同时运行;
  • 可被终止的预清理,与用户线程同时运行;
  • 从新标记 ,会致使swt;
  • 并发清除,与用户线程同时运行;

其实,只要回答四个就差很少了,是这几个。

  • 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,须要“Stop The World”。
  • 并发标记:进行GC Roots Tracing的过程,在整个过程当中耗时最长。
  • 从新标记:为了修正并发标记期间因用户程序继续运做而致使标记产生变更的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但远比并发标记的时间短。此阶段也须要“Stop The World”。
  • 并发清除

你觉得这样子就能够了,面试官就会说能够了,若是能够了,那估计你凉了!

面试官说:CMS这么好,那有没有什么缺点呢?

我。。。好吧,谁怪我这么强呢,对吧。

其实,CMS虽然通过这么些年的考验,已是一个值得信赖的GC回收器了,可是,其实也是有一些他的不足的,

第一,垃圾碎片的问题,咱们都知道CMS是使用的是标记-清除算法的,因此不可避免的就是会出现垃圾碎片的问题。
第二,通常CMS的GC耗时80%都在remark阶段,remark阶段停顿时间会很长,在CMS的这四个主要的阶段中,最费时间的就是从新标记阶段。
第三,concurrent mode failure,说出这个的时候,面试官就会以为,小伙子,哎呦,不错哟,掌握的比较清楚,那这个是什么意思呢,实际上是说:

这个异常发生在cms正在回收的时候。执行CMS GC的过程当中,同时业务线程也在运行,当年轻带空间满了,执行ygc时,须要将存活的对象放入到老年代,而此时老年代空间不足,这时CMS尚未机会回收老年带产生的,或者在作Minor GC的时候,新生代救助空间放不下,须要放入老年代,而老年代也放不下而产生的。

第四,promotion failed,这个问题是指,在进行Minor GC时,Survivor空间不足,对象只能放入老年代,而此时老年代也放不下形成的,多数是因为老年代有足够的空闲空间,可是因为碎片较多,新生代要转移到老年带的对象比较大,找不到一段连续区域存放这个对象致使的。

面试官看到你掌握的这么好,内心已经给你竖起来大拇指,可是,面试官以为你优秀啊,就还想看看你到底还有多少东西。

既然你知道有这么多的缺点,那么你知道怎么解决这些问题吗?

这个真的被问蒙了,你觉得我什么都会吗!!!!

可是,我仍是得给你们讲讲,否则下次被问到,可能会把锅甩给我。

  • 垃圾碎片的问题:针对这个问题,这时候咱们须要用到这个参数:-XX:CMSFullGCsBeforeCompaction=n 意思是说在上一次CMS并发GC执行事后,到底还要再执行多少次full GC才会作压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会作压缩。
  • concurrent mode failure

解决这个问题其实很简单,只须要设置两个参数便可

-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=60:是指设定CMS在对内存占用率达到60%的时候开始GC。

为何设置这两个参数呢?因为在垃圾收集阶段用户线程还须要运行,那也就还须要预留有足够的内存空间给用户线程使用,所以CMS收集器不能像其余收集器那样等到老年代几乎彻底被填满了再进行收集。

固然也不能设置太高,好比90%,这时候虽然GC次数少,可是,却会致使用于用户线程空间小,效率不高,过低10%,你本身想一想会怎么样,体会体会!

哈哈,万事大吉,这一点说出了,估计面试官已经爱上我了吧,赶忙把我招进去干活吧。。。
  • remark阶段停顿时间会很长的问题:解决这个问题巨简单,加入-XX:+CMSScavengeBeforeRemark。在执行remark操做以前先作一次Young GC,目的在于减小年轻代对老年代的无效引用,下降remark时的开销。

结尾

面到这里,面试官给你说了一句:小伙子很优秀,思考问题很深刻,何时能够来咱们公司实习,咱们公司转正概率很高啊,欢迎您的加入!

相关文章
相关标签/搜索