也谈G1垃圾回收器

       目前关于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垃圾回收器的名称由来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353