悲观者从机会中看到困难。乐观者从困难中看到机会。
——温斯顿·丘吉尔
区别一:使用的范围不一样:
- CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。
- G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用
区别二:STW的时间:
- CMS收集器以最小的停顿时间为目标的收集器
- G1收集器可预测垃圾回收已 的停顿时间(建立可预测的停顿时间模型)
区别三: 垃圾碎片
- CMS收集器是使用“标记-清除"算法进行的垃圾回收,容易产生内存碎片
- G1收集器使用的是"标记-整理"算法,进行了空间整合,没有内存空间碎片
区别四: 垃圾回收的过程不一样
注意这两个收集器第四阶段得不同
区别五:CMS会产生浮动垃圾
- CMS产生浮动垃圾过多时会退化为serial old,效率低,因为在上图的第四阶段,CMS清除垃圾时是并发清除的,这个时候,垃圾回收线程和用户线程同时工作会产生浮动垃圾,也就意味着CMS垃圾回收器必须预留一部分内存空间用于存放浮动垃圾
- 而G1没有浮动垃圾,G1的筛选回收是多个垃圾回收线程并行gc的,没有浮动垃圾的回收,在执行'并发清理'步骤时,用户线程也会同时产生一部分可回收对象,但是这部分可回收对象只能在下次执行清理是才会被回收。如果在清理过程中预留给用户线程的内存不足就会出现"Concurrent Mode Failyre,一旦出现此错误时便会切换到SerialOld收集方式。