CMS垃圾收集器
特点:
内存区域分为:
- 年轻代
- 年老代
- 永久带
回收过程
- 初始标记
- 并发标记
- 重新标记
- 并发回收
cms垃圾收集器回收过程由以上几个步骤组成,其中1、3步骤会stop-the-world。
优点:并发、低停顿
缺点:
- 无法清理浮动垃圾,4.并发回收 阶段也会产生垃圾,这部分垃圾CMS是无法进行回收只有等到下次垃圾回收周期才能进行清理。
- 对cpu资源敏感,如果cpu资源不够用会比其他垃圾收集器性能更差。
- CMS采用“标记-清除”算法会产生空间碎片,碎片过多的话会影响大对象分配、对象晋升。
CMS GC:
1.Young GC
2.Old GC
3.Full GC
- CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
- 统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;
- CMS主动触发Full GC来避免碎片问题。
G1垃圾收集器
内存区域:
堆被划分为一组大小相等的堆region,每个堆region都包含一个连续范围的虚拟内存。某些region集被分配了与较旧的收集者相同的角色(eden,幸存者,旧角色),但是它们的大小并没有固定。这在内存使用方面提供了更大的灵活性。
回收过程:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
G1垃圾收集器回收过程由以上几个步骤组成,其中1、3步骤会stop-the-world。
优点:
- 并发回收
- 分代收集
- 没有内存碎片产生:由于G1使用了独立区域(Region)概念,G1从整体来看是基于“标记-整理”算法实现收集
- 可预测的停顿:G1除了回收速度快,还可以根据设置的回收停顿时间去进行回收。
缺点:适合大堆(6G以上)
G1 GC:
1.Young GC:当所有eden region使用达到最大阀值并且无法申请足够内存时,会触发一次YoungGC
2.Mixed GC:当越来越多的对象晋升到老年代Old Region时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即Mixed GC,该算法并不是一个Old GC,除了回收整个Young Region,还会回收一部分的Old Region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择哪些Old Region进行收集,从而可以对垃圾回收的耗时时间进行控制
3.Full GC:与cms一样,当空间不够用的时候g1也会退化成serial old gc进行垃圾收集。
-
concurrent mode failure:并发模式失败,CMS 收集器也有同样的概念。G1 并发标记期间,如果在标记结束前,老年代被填满,G1 会放弃标记。
这个时候说明
- 堆需要增加了,
- 或者需要调整并发周期,如增加并发标记的线程数量,让并发标记尽快结束
- 或者就是更早地进行并发周期,默认是整堆内存的 45% 被占用就开始进行并发周期。
-
晋升失败:并发周期结束后,是混合垃圾回收周期,伴随着年轻代垃圾收集,进行清理老年代空间,如果这个时候清理的速度小于消耗的速度,导致老年代不够用,那么会发生晋升失败。
说明混合垃圾回收需要更迅速完成垃圾收集,也就是说在混合回收阶段,每次年轻代的收集应该处理更多的老年代已标记区块。
-
疏散失败:年轻代垃圾收集的时候,如果 Survivor 和 Old 区没有足够的空间容纳所有的存活对象。这种情况肯定是非常致命的,因为基本上已经没有多少空间可以用了,这个时候会触发 Full GC 也是很合理的。
最简单的就是增加堆大小
-
大对象分配失败,我们应该尽可能地不创建大对象,尤其是大于一个区块大小的那种对象。