面试官99.99%会严刑拷打的几种垃圾收集器,各自的优缺点,包括原理,流程,优缺点。

1)几种垃圾收集器:

  • Serial收集器: 单线程的收集器,收集垃圾时,必须stop the world(即只运行GC线程,暂停所有用户线程),用户体验感不好,使用复制算法,但是并未过时,到现在为止,依然是虚拟机运行在Client模式下的默认新生代收集器。

  • ParNew收集器: Serial收集器的多线程版本,实际上与Serial收集器共用了很多代码,也需要stop the world,使用复制算法。

  • Parallel Scavenge收集器: 新生代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个可控的吞吐量。如果虚拟机总共运行100分钟,其中垃圾花掉1分钟,吞吐量就是99%,即吞吐量 = 运行用户代码的时间/(运行用户代码的时间 + 垃圾收集时间 ) 。

  • Serial Old收集器: 是Serial收集器的老年代版本,单线程收集器,使用标记整理算法。

    • 两大用途:
      • 1.再JDK1.5之前与 Parallel Scavenge收集器 搭配使用。
      • 2.作为CMS的后备预案,再并发收集发生Concurrent Mode Failure时使用。
  • Parallel Old收集器: 是Parallel Scavenge收集器的老年代版本,使用多线程,标记-整理算法。解决了Parallel Scavenge收集器的尴尬状态,在整体应用上获得了吞吐量最大化的效果。

  • CMS(Concurrent Mark Sweep) 收集器: 是一种以获得最短回收停顿时间为目标的收集器,使用标记清除算法。

    • 常见的应用场景:是互联网站或者B/S系统的服务端上的Java应用。
    • 运作过程:
      • 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。
      • 并发标记:进行GC Roots Tracing的过程,在整个过程中耗时最长。
      • 重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。此阶段也需要“Stop The World”。
      • 并发清除。
    • 收集结束会产生大量空间碎片。
    • 缺点:
      • 1.对cpu资源敏感:会因为占用一些线程资源而导致应用程序变慢,其默认启用的回收线程数是(cpu数量+3)/4;也就是说cpu数量越多,所占用的比越小,影响程度越小,cpu越少影响程度越大(例如2个cpu,执行速度会降低50%)

      • 2.无法处理浮动垃圾,可能会导致concurrent mode failure异常。

        • 浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为“浮动垃圾”。
      • 3.会产生大量的内存碎片;由于使用了标记-清除算法,将会给大对象分配内存带来麻烦,可能会导致promotion failed

        • promotion failed:这个问题是指,在进行Minor GC时,Survivor空间不足,对象只能放入老年代,而此时老年代也放不下造成的,多数是由于老年代有足够的空闲空间,但是由于碎片较多,新生代要转移到老年代的对象比较大,找不到一段连续区域存放这个对象导致的。
      • 4.一般CMS的GC停顿耗时80%都在remark阶段,remark阶段停顿时间会很长,在CMS的这四个主要的阶段中,停顿最长时间的就是重新标记阶段。

concurrent mode failure异常

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

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

  • 垃圾碎片的问题:针对这个问题,我们需要用到这个参数-XX:CMSFullGCsBeforeCompaction=n
    意思是说在上一次CMS并发GC执行过后,到底还要再执行多少次full GC才会做压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了要转入full GC的时候都会做压缩 (内存碎片的整理过程空间碎片的问题解决了,但这个过程是单线程的,停顿的时间会变长)。
  • concurrent mode failure 异常问题: 将参数-XX:CMSInitiatingOccupancyFraction适当设置低一些
    (例如:-XX:CMSInitiatingOccupancyFraction=60:是指设定CMS在对内存占用率达到60%的时候就开始GC。)

G1垃圾收集器

G1是什么?

讲到这里想必有点累了,点这里,跳转一下,带着你的疑问来吧,我会在另一篇文章详细讲解 G1 !!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值