G1和CMS垃圾收集器

时间:2021-09-06 14:59:20

1.CMS收集器 

    Concurrent Mark Sweep   CMS收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的相应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。

   CMS是基于标记-清除 算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,

   初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,

   并发标记阶段:进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

  由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

2.G1收集器

   是当今收集器技术发展的最前沿成果之一,G1是一款面向服务端应用的垃圾收集器。具有以下特点:

   并行和并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短停顿时间,部分其他收集器原本需要停顿java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。

   分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。

 空间整合: 与CMS的“标记-清理”算法不同,G1从整体来看是基于“标记-整理”算法实现的收集器,从局部看是基于“复制”算法实现的,但无论如何,都意味着G1运作期间不会产生内存空间碎片,收集后能够提供规整的可用内存,这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC

  可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同关注点, 但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

    G1将整个java堆划分为多个大小想等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离了,它们都是一部分Region(不需要连续)的集合。

 G1跟踪各个region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的手机时间,优先回收价值最大的Region。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的手机效率。