垃圾回收器之CMS与G1详解

前言        

        当今的Java虚拟机(JVM)提供了多种垃圾回收器,其中包括CMS(Concurrent Mark Sweep)和G1(Garbage-First)垃圾回收器。这两种垃圾回收器都是为了解决在大型应用程序中产生的长时间停顿问题而设计的。本文将详细介绍CMS和G1垃圾回收器的工作原理和特点。

CMS

        CMS垃圾回收器是一种基于标记-清除算法的并发回收器。它的目标是尽可能减少垃圾收集时的停顿时间。CMS垃圾回收器主要分为四个阶段:初始标记、并发标记、重新标记和并发清除。

初始标记

        在初始标记阶段,CMS垃圾回收器会暂停应用程序的执行,标记所有的根对象和直接与根对象相关联的对象。这个阶段的停顿时间通常很短,因为它只是一个快速的标记过程。

并发标记

        接下来是并发标记阶段,CMS垃圾回收器会与应用程序并发执行,标记所有从根对象可达的对象。这个阶段的目标是尽可能减少对应用程序的影响,因此它会与应用程序并发执行,不会暂停应用程序的执行。但是,由于应用程序在执行过程中可能会不断产生新的对象,因此并发标记阶段可能需要多次迭代,直到没有新的对象可达为止。

重新标记

        在并发标记阶段完成后,CMS垃圾回收器会进行重新标记阶段。这个阶段会暂停应用程序的执行,重新标记在并发标记阶段中产生的新对象。这个阶段的停顿时间通常比初始标记阶段稍长,但仍然比全局停顿的垃圾回收器要短。

并发清除

        最后是并发清除阶段,CMS垃圾回收器会与应用程序并发执行,清除标记为垃圾的对象。这个阶段的目标是尽可能减少对应用程序的影响,因此它会与应用程序并发执行,不会暂停应用程序的执行。

CMS的缺点

1、对处理器敏感
        并发标记、并发清理阶段,虽然CMS不会触发STW(stop the world),但是标记和清理需要GC线程介入处理,GC线程会占用一定的CPU资源,进而导致程序的性能下降,程序响应速度变慢。CPU核心数多的话还稍微好一点,CPU资源紧张的情况下,GC线程对程序的性能影响非常大。

2、浮动垃圾
        并发清理阶段,由于用户线程仍在运行,在此期间用户线程制造的垃圾就被称为“浮动垃圾”,浮动垃圾本次GC无法清理,只能留到下次GC时再清理。

3、并发失败
        由于浮动垃圾的存在,因此CMS必须预留一部分空间来装载这些新产生的垃圾。CMS不能像Serial Old收集器那样,等到Old区填满了再来清理。在JDK5时,CMS会在老年代使用了68%的空间时激活,预留了32%的空间来装载浮动垃圾,这是一个比较偏保守的配置。如果实际引用中,老年代增长的不是太快,可以通过-XX:CMSInitiatingOccupancyFraction参数适当调高这个值。到了JDK6,触发的阈值就被提升至92%,只预留了8%的空间来装载浮动垃圾。
如果CMS预留的内存无法容纳浮动垃圾,那么就会导致「并发失败」,这时JVM不得不触发预备方案,启用Serial Old收集器来回收Old区,这时停顿时间就变得更长了。

4、内存碎片
        由于CMS采用的是「标记清除」算法,这就意味这清理完成后会在堆中产生大量的内存碎片。内存碎片过多会带来很多麻烦,其一就是很难为大对象分配内存。导致的后果就是:堆空间明明还有很多,但就是找不到一块连续的内存区域为大对象分配内存,而不得不触发一次Full GC,这样GC的停顿时间又会变得更长。

G1

        相比之下,G1垃圾回收器是一种基于分代收集和区域化的垃圾回收器。它的目标是在有限的停顿时间内,尽可能高效地回收垃圾。G1垃圾回收器将堆内存划分为多个大小相等的区域,每个区域可以是Eden区、Survivor区或Old区。G1垃圾回收器的工作过程主要分为四个阶段:初始标记、并发标记、最终标记和并发清除。

初始标记

        初始标记阶段与CMS垃圾回收器的初始标记阶段类似,它会暂停应用程序的执行,标记所有的根对象和直接与根对象相关联的对象。这个阶段的停顿时间通常很短。

并发标记

        并发标记阶段与CMS垃圾回收器的并发标记阶段类似,它会与应用程序并发执行,标记所有从根对象可达的对象。与CMS垃圾回收器不同的是,G1垃圾回收器会根据目标停顿时间来控制并发标记的进度,以确保在给定的停顿时间内完成标记。

最终标记

        最终标记阶段与CMS垃圾回收器的重新标记阶段类似,它会暂停应用程序的执行,重新标记在并发标记阶段中产生的新对象。这个阶段的停顿时间通常比初始标记阶段稍长,但仍然比全局停顿的垃圾回收器要短。

并发清除

        最后是并发清除阶段,G1垃圾回收器会与应用程序并发执行,清除标记为垃圾的对象。与CMS垃圾回收器不同的是,G1垃圾回收器会优先清理垃圾最多的区域,以最大程度地回收空间。

三色标记算法

        CMS和G1垃圾回收器都使用三色标记算法来并发标记可达对象,同时保证了垃圾回收的停顿时间可控。

        三色标记算法是一种用于垃圾回收的算法,它将对象分为三种状态:白色、灰色和黑色。该算法通过标记可达对象,将未被标记的对象视为垃圾进行回收。

具体来说,三色标记算法的执行过程如下:

  1. 初始时,所有对象都被标记为白色。

  2. 垃圾回收器从根对象开始,将根对象标记为灰色,并将其加入待处理队列。

  3. 垃圾回收器从待处理队列中取出一个灰色对象,将其标记为黑色,并将其引用的对象标记为灰色,加入待处理队列。

  4. 重复步骤3,直到待处理队列为空。

  5. 最终,所有可达对象都会被标记为黑色,而未被标记的对象即为垃圾。

        在执行过程中,黑色对象表示已经被标记为可达的对象,灰色对象表示已经被发现但未被完全处理的对象,白色对象表示未被发现的对象。垃圾回收器通过将灰色对象加入待处理队列,逐个处理灰色对象及其引用的对象,直到所有可达对象都被标记为黑色。

        三色标记算法的优点是可以并发标记可达对象,同时保证了垃圾回收的停顿时间可控。它利用了并发标记阶段和并发清理阶段的并行性,提高了垃圾回收的效率。

总结

        综上所述,CMS和G1垃圾回收器都是为了解决大型应用程序中长时间停顿的问题而设计的。CMS垃圾回收器通过并发执行和分阶段的方式来减少停顿时间,而G1垃圾回收器通过区域化和目标停顿时间控制来提高回收效率。选择合适的垃圾回收器取决于应用程序的特点和需求,开发人员需要根据实际情况进行选择和调优。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值