美文网首页Java基础
也谈G1垃圾回收器

也谈G1垃圾回收器

作者: mawu_1014 | 来源:发表于2019-03-24 14:57 被阅读0次

           目前关于G1垃圾回收器的相关介绍很多,最近阅读了下oracle公司的说明,也想谈谈自己对于G1的理解,如果有不准确的地方,欢迎指正。


    1、堆模型比较

           虚拟机内存模型主要包括五大块,分别是虚拟机栈,本地方法栈,程序计数器,堆方法区。其中虚拟机栈、本地方法栈和程序计数器都是线程私有的,不存在垃圾回收的问题。垃圾回收主要发生在堆和方法区上。而方法区的回收效率低(主要原因在于 方法区上存放的是编译后的class信息和常量等,不容易被回收)。因此回收主要发生在堆上。    

            jvm堆模型在G1出现之前如下图所示。

    传统垃圾回收器堆模型

            主要包括三大块:新生代,老年代和永久代。在hotspot虚拟机中,永久代是用来实现了方法区。如前所述,在永久代的回收效率并不高。三块区域在物料内存上是连续的。

            新生成的对象会分配到新生代,当新生代被占满时,会通过Gc将存活的对象复制到survivor区,满足晋升条件的对象或者survivor不够时会触发内存担保,对象会进入old Generation。

            而G1堆模型如下

    G1 堆模型

            G1垃圾回收器不对堆进行连续切分为三块,而是将堆切分为一个更小的纬度: region。每快Region大小是相同的,最小为1M, 最大为32M。一般会将堆分为2000块。因此可以大致估计适用jvm 堆大小约为2G - 64G。

            G1垃圾回收器每块region也分为eden sruvivor和old。但不在物理上连续,只在逻辑上连续。此外还有一种为Humongous,当对象大小超过region大小一半时,会直接分配H区,但是大对象的回收没有优化,因此要避免在产生这样的大对象。G1的堆模型并不会规定各个区的大小,因此给内存分配和垃圾回收带来极大的灵活性。

    2、堆回收算法比较

        传统垃圾回收器是需要搭配使用的,在新生代和老年代分别使用不同的回收器。各垃圾回收器比较如下。

    各垃圾回收器比较

    比较典型的搭配是parNew(负责新生代) + CMS(负责老年代)。 gc方式主要包括两种:minor gc major gc。

            minor gc发生在Young Generation区,采用复制算法。数据分配首先都分配在新生代,当新生代满后,会触发minor gc,数据会复制到survivor区,如果survivor不够或者到达晋升年龄,数据会从新生代晋升到老年代。

            当老年代不够分配给新对象时,会触发major gc。需要注意的是CMS回收器的major gc采用是标记清除算法,只清除不整理,容易产生内存碎片。当内存碎片太多,majorGc后仍不够分配的情况下,会触发一次full gc,进行全堆回收。CMS提供了参数 -XX:CMSFullGCsBeforeCompaction指定在多次majorgc后执行一次带压缩的full gc。需要注意的是cms的major gc会触发一次minor gc,而且在做major gc时候是全堆扫描。

    major  gc前 major gc后

        从上面可以看到,cms做完并发清理后,老年代仍然存在很多碎片。

        G1垃圾回收器回收算法主要包括三种:young gc, mixed gc以及full gc。三种回收方式都是标记整理,可以有效避免碎片的产生,提高内存使用情况。

    G1垃圾回收算法

        G1垃圾回收的过程主要包括以下几个部分,需要注意其中部分过程是mixed和young都存在的。

            1、Initial Mark:STW, 在young gc时候完成,标记可能指向old 区的对象的survivor区;

            2、Root Region Scanning:扫描Initial Mark中标记的survivor区指向老年代对象的引用,需要在young gc完成前结束。

            3、 Concurrent Marking:扫描整堆上存活的对象,可以被young gc打断

            4、Remark:Mark:STW, 完成整个标记工作,基于SATB算法,重标记的速度远远快于CMS上的重标记。

            5、Cleanup:STW, 统计存活对象和空白区域,重制RSet,将空白区域放入空闲列表

            6、Copying:STW,  将存活对象拷贝到其他空白位置,可以通过gc日志区分这个阶段是发生在young gc还是mixed gc上。

    3 G1垃圾回收器特点  

        在JDK 12发布ZGC之前,G1垃圾回收器一直代表着回收器的最新技术水平,作为G1与以前的回收器相比有哪些特点呢?   

        1、基于标记整理算法,有效避免空间碎片产生;

        2、基于可停顿的时间,提供最高的回收效果,即在指定的时间范围内,回收最大的内存空间。

        It is important to note that G1 is not a real-time collector. It meets the set pause time target with high probability but not absolute certainty. Based on data from previous collections, G1 does an estimate of how many regions can be collected within the user specified target time. Thus, the collector has a reasonably accurate model of the cost of collecting the regions, and it uses this model to determine which and how many regions to collect while staying within the pause time target.

        第一点其实比较明显,有意思的是第二点是如何实现的呢?实际上是G1在做垃圾回收时候,存在一个全局标记阶段,标记完后回收器即知道回收哪些区域可以获得最大的内存,此外G1回收器会基于回收模型算法,基于前面的回收情况,评估在期望的时间范围内可以回收多少块region并优先对这些高回收价值的region进行回收,这也是G1垃圾回收器的名称由来

    相关文章

      网友评论

        本文标题:也谈G1垃圾回收器

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