G1 vs CMS详细对比

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

G1 VS CMS

GC分类:

  • Minor GC 会清理年轻代的内存。(正常情况大部分年轻代对象朝生夕灭,基本都不存在伊甸区拷贝更不说去老年代了)

  • Major GC 是清理老年代。

  • Full GC 是清理整个堆空间—包括年轻代和老年代

     

评价垃圾回收质量的两个指标:

  • 停顿时间

  • 吞吐量

 

CMS垃圾回收器(基于标记清除):

G1 vs CMS详细对比_第1张图片

1、初始标记(STW):标记Gc root根对象,及新生代应用的老年代对象,并作标记。时间快;

2、并发标记:标记线程和用户线程并发执行,标记出根对象的可达路径。从初始标记开始找出所有存活对象(耗时长)。

3、重新标记(STW):从root开始重新扫描直接,间接关联对象,以及上述时间内程序产生的新垃圾对象(远比并发标记时间短)。

4、并发清除:清理垃圾对象。

优点:

并发收集、低停顿。

缺点:

1、内存碎片:由于基于标记清除,因此有内存碎片。

2、cpu敏感:由于并发执行,占用一定的内存cpu,吞吐量会下降

3、浮动垃圾:由于并发处理,用户线程正在使用垃圾无法收集,因此比较早(68%)就要启动收回,回收失败会导致降级为串行收集,有比较大的STW。

https://blog.csdn.net/zqz_zqz/article/details/70568819

 

老GC遵循原则:

  1. 年轻代、老年代是独立且连续的内存块;

  2. 年轻代收集使用单eden、双survivor进行复制算法;

  3. 老年代收集必须扫描整个老年代区域;

  4. 都是以尽可能少而块地执行GC为设计原则。

 

G1垃圾回收(划分若干Region、基于标记整理):

设计原则:

1、引入分区的思路,弱化了分代的概念,回收时则以分区为单位进行回收。每个分区都可能随G1的运行在不同代之间前后切换。(1MB~32MB, 默认2048个分区)

2、首先收集尽可能多的垃圾(Garbage First),采用启发式收集算法,在老年代找出具有高收集收益的分区进行收集(cms则会在将要耗尽内存时候再回收).

3、G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大。

4、G1的收集都是STW的,采用了混合(mixed)收集的方式,同时收集新生代、老年代,通过限制收集范围来控制停顿时间。

回收流程

G1 vs CMS详细对比_第2张图片

1、初始标记(STW):标记Gc root根对象并发标记。时间快;

2、根区域扫描(root region scan):根分区扫描,所有新复制到Survivor分区的对象,都需要被扫描并标记成根,这个过程称为根分区扫描(Root Region Scanning)。

2、并发标记:标记线程和用户线程并发执行,标记出根对象的可达路径。从初始标记开始找出所有存活对象(耗时长)。

3、重新标记(STW):从root开始重新扫描直接,间接关联对象,以及上述时间内程序产生的新垃圾对象(远比并发标记时间短)。

4、筛选回收(清除):筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。

优点:

1、可根据用户设置停顿时间,制定回收计划(但是也可能存在超出用户的停顿时间).

2、无内存碎片:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。

 

https://blog.csdn.net/coderlius/article/details/79272773

转载于:https://my.oschina.net/tantexian/blog/3037088

你可能感兴趣的:(G1 vs CMS详细对比)