美文网首页
[垃圾收集器]G1收集器

[垃圾收集器]G1收集器

作者: 6cc89d7ec09f | 来源:发表于2018-12-15 18:37 被阅读14次

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

知识点:

  • 1 常见的几种垃圾收集器的组合

    • 串行收集器
      在Client模式下默认的收集器


      image.png

    串行收集器组合: Serial + Serial Old
    运行机制:串行收集器采用单线程stop-the-world的方式进行收集。当内存不足时,串行GC设置停顿标识,待所有线程都进入安全点(Safepoint)时,应用线程暂停,串行GC开始工作,采用单线程方式回收空间并整理内存

    特点:1 单线程stop-the-world的方式进行收集 . 2 久经考验,稳定
    优点:采用单线程方式回收空间并整理内存。单线程也意味着复杂度更低、占用内存更 少
    缺点:但同时也意味着不能有效利用多核优势
    使用场景:串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。

    • 并行收集器
      server模式下的默认收集器配置


      image.png

    并行收集器组合: Parallel Scavenge + Parallel Old
    运行机制:都是stop-the-world方式,只是暂停时并行地进行垃圾收集。年轻代采用复制算法,老年代采用标记-整理,在回收的同时还会对内存进行压缩。
    特点:并行收集器是以关注吞吐量为目标的垃圾收集器
    场景:并行收集器适合对吞吐量要求远远高于延迟要求的场景,并且在满足最差延时的情况下,并行收集器将提供最佳的吞吐量。

    • 并发标记清除收集器
      并发标记清除(CMS)是以关注延迟为目标、十分优秀的垃圾回收算法,开启后,年轻代使用STW式的并行收集,老年代回收采用CMS进行垃圾回收,对延迟的关注也主要体现在老年代CMS上。


      image.png

    并发标记清除收集器组合 ParNew + CMS + Serial Old(担保,FullGC时使用)
    收集机制:年轻代ParNew与并行收集器类似,使用STW式的并行收集。

    老年代CMS每个收集周期都要经历:初始标记、并发标记、重新标记、并发清除。其中,初始标记以STW的方式标记所有的根对象;并发标记则同应用线程一起并行,标记出根对象的可达路径;在进行垃圾回收前,CMS再以一个STW进行重新标记,标记那些由mutator线程(指引起数据变化的线程,即应用线程)修改而可能错过的可达对象;最后得到的不可达对象将在并发清除阶段进行回收。

    场景:CMS非常适合堆内存大、对延迟敏感、CPU核数多的服务器端应用

    缺点:可能会造成较大的停顿

    原因1 :由于并发进行,CMS在收集与应用线程会同时会增加对堆内存的占用,也就是说,CMS必须要在老年代堆内存用尽之前完成垃圾回收,否则CMS回收失败时,将触发担保机制,串行老年代收集器将会以STW的方式进行一次GC,从而造成较大停顿时间;

    原因2:标记清除算法无法整理空间碎片,老年代空间会随着应用时长被逐步耗尽,最后将不得不通过担保机制对堆内存进行压缩。CMS也提供了参数-XX:CMSFullGCsBeForeCompaction(默认0,即每次都进行内存整理)来指定多少次CMS收集之后,进行一次压缩的Full GC。

    • Garbage First (G1)
      G1垃圾收集器也是以关注延迟为目标、服务器端应用的垃圾收集器,虽然G1也有类似CMS的收集动作:初始标记、并发标记、重新标记、清除、转移回收,并且也以一个串行收集器做担保机制,但是也有很大的不同

      区别

    回收时机不同:G1不会再等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是首先收集尽可能多的垃圾(Garbage First),G1跟踪了各个region的垃圾堆积,优先找出具有高收集收益的分区进行收集。Region划分内存以及优先级的区域回收方式,让G1能够预测时间模型,即可以让用户设置停顿时间再M毫秒之内。
    好处:提高了垃圾收集的效率,可预测停顿时间模型

    内存分区(Region)不同:将内存划分为一个个相等大小的内存分区,每个分区都有机会成为年轻代或者是老年代。回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
    好处:减少了FullGC次数

    分代的概念不同:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;


    image.png

分代的界限模糊:G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),
好处:这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。

场景:可以替换CMS收集器,适用于CMS的场景

相关文章

  • JVM源码分析系列

    JVM G1算法系列 G1垃圾收集器介绍 G1垃圾收集器之RSet G1垃圾收集器之SATB G1垃圾收集器之对象...

  • G1收集器详解

    详解 JVM Garbage First(G1) 垃圾收集器 G1垃圾收集器入门

  • Java G1垃圾回收

    G1 垃圾收集器 Garbage-First (G1) 收集器是一种服务器式垃圾收集器,针对具有大内存的多处理器机...

  • G1垃圾收集器

    G1垃圾收集器在JDK1.7中投入使用,并作为JDK1.9默认的垃圾收集器。 JVM配置开启G1参数: 一、G1与...

  • 23-一文带你搞懂G1收集器

    G1收集器介绍 Garbage First(简称G1) 收集器是垃圾收集器技术发展历史上的里程碑式的成果, 它开创...

  • 垃圾回收文章

    深入理解 Java G1 垃圾收集器

  • 深入学习JVM(三) -- JVM垃圾收集-G1

    G1 (Garbage First)垃圾收集器 因为上一篇文章JVM垃圾收集器总结[https://juejin....

  • G1垃圾收集器,永久带和元数据区

    引用地址 G1垃圾收集器,永久带和元数据区 我们收到了一些围绕G1垃圾收集器和使用永久带的一些问题。当G1作为垃圾...

  • G1垃圾收集器实现原理

    1 与垃圾收集器有关的算法 在分析G1前先简单回顾一下与垃圾收集器相关的算法。通常所谓的垃圾收集器更多地是指跟踪垃...

  • jvm垃圾收集器

    收集算法是内存回收的方法论,而垃圾收集器就是内存回收的具体实现。主要垃圾收集器分为下面几种,而G1收集器将在另一篇...

网友评论

      本文标题:[垃圾收集器]G1收集器

      本文链接:https://www.haomeiwen.com/subject/smbahqtx.html