G1垃圾收集器

G1垃圾收集器(Garbage-First Garbage Collector)

介绍

G1垃圾收集器是一种针对多核、大内存计算机的垃圾收集器。其主要目标是即使不做任何配置,也能在很大程度上达成垃圾收集停顿时长目标,同时维持高吞吐量。G1垃圾收集器试图在特定应用程序及环境下维持延迟和吞吐量的最佳平衡。“特定”程序及环境一般有如下特性:

  • 数十GB堆内存及以上,其中超过50%的区域包含实时数据。

  • 对象分配、换代频率极其随机。

  • 堆内存碎片化现象十分严重。

  • 目标停顿时间预计不超过几百毫秒,避免因垃圾回收停顿太长时间。

替换掉了并发标记清除收集器(Concurrent Mark-Sweep (CMS) collector)。(自JDK9,G1代替 Parallel GC成为JDK默认垃圾收集器)

G1收集器通过几种方式实现高性能、高可用性。具体方式会在接下来分几部分介绍。

启用G1

G1垃圾收集器是默认收集器,你一般情况下无须做任何操作。(在命令行使用命令-XX:+UseG1GC可显式启用)

基本概念

G1是一种分代、增量、并行、部分并发、全局停止、实行对象转移的垃圾收集器,每次全局停止期间会实时监控停顿时长目标。 和其他收集器类似,G1收集器将堆内存分为(虚拟)年轻代和老年代。G1回收内存空间时着重关注效率最高的年轻代,偶尔回收老年代内存空间。

为了提高吞吐量,某些操作只会在全局停止期间才会进行。一些操作(比如全堆标记(global marking)等涉及整个堆的操作)在应用程序停止时进行会耗费更多时间,因此这类操作会与应用程序并行、并发执行。为缩短内存回收时全局停止的时长,G1收集器会已增量的方式分阶段、并行执行空间回收。 G1收集器会通过跟踪既往应用行为和垃圾收集停顿,建立反映相应回收成本的模型来保证预计停顿时长的准确性。该收集器利用这个模型分析之前停顿时所做工作。例如,G1收集器会首先回收回收效率最高的内存区域(即大部分区域都由垃圾对象占据,Garbage-First之名也由此而来)。

G1收集器回收内存主要靠对象转移:将预选内存区域内的发现的活动对象整理后复制到新的内存区域。转移结束后,活动对象先前占据的内存空间可以供程序重新分配。

G1垃圾收集器并不是实时的。它会尝试在一段时间内尽力达成设置的停顿时长目标,但不能保证某个停顿期的停顿时长一定能符合目标。

堆内存布局

G1收集器将堆内存划分为一个个大小相等的子区域,每个子区域都覆盖一段连续的虚拟内存区,如图9-1所示。子区域是内存分配、内存回收的基本单位。在任一时刻,这样的区域可能存在两种状态:空闲(浅灰色)、分配给年轻代或老年代。当应用程序请求内存时,内存管理器会将空闲内存区域分配出去。内存管理器将这些子区域分配到某一代际,然后将其作为空闲区域返回给应用程序供其分配。

图 9-1 G1垃圾收集器堆内存布局

Description of Figure 9-1 follows

年轻代由Eden区(红色)和Survivor区(红色带S标记)。这些区域和其他垃圾收集器中的对应内存区域功能大体一致,区别在于,在G1内存布局下,这些内存区在内存中所占空间并不连续。图中所有的浅蓝色区域即构成了老年代。老年代中涵盖数块子区域的内存区被称为巨型对象区域(Humongous Region)(浅蓝色带H标记)。

应用程序为对象分配内存时永远只使用某一Eden区子区域,不过巨型对象会被直接分配到老年代中。

G1垃圾收集器在暂停期间可以回收整个年轻代的空间,此外,在任何暂停期间均可回收需要回收的老年代内存区域集合。在暂停期间,G1收集器会将当前待回收子区域集中的对象复制到堆中一个或多个不同区域。某一对象的目标区域取决于该对象的来源:整个年轻代会被复制到Survivor区或老年代区域,老年代的对象会根据老化(Aging)程度复制到其他不同的老年代区域。

垃圾回收周期

抽象来看,G1收集器的垃圾收集过程分两种阶段,这两个阶段交替进行。在young-only阶段,收集器将年轻代中的对象复制到老年代中的空闲区域,直至填满。在空间回收(space-reclamation)阶段,G1收集器以增量的方式回收老年代空间,并同时进行年轻代内存回收。然后,循环从young-only阶段重新开始。

图 9-2 垃圾回收周期总览

Description of Figure 9-2 follows

上图展示了G1收集器两个阶段执行序列以及期间可能出现的停顿。图中填充的圆圈代表垃圾收集的暂停:蓝色圆圈代表young-only阶段,橙色圆圈代表标记(marking)引起的暂停,红色圆圈代表混合收集(mixed collection)暂停。所有暂停通过两个箭头串联在一起,形成一个循坏:箭头分别代表young-only阶段和混合收集(mixed collection)阶段。young-only阶段从几个用蓝色小圆圈表示的young-only垃圾收集开始。当老年代中的对象占用率达到initiatingheapoccuancypercent定义的阈值之后,下一次垃圾收集暂停将变成初始标记垃圾收集暂停,即图中较大的蓝色圆圈。除了执行与其他young-only阶段暂停相同的工作之外,该停顿期间,收集器还会为并发标记做些准备工作。

在并发标记和Remark导致的暂停(第一个大的橙色圆圈,此时G1收集器完成标记)之间,可能会同时发生young-only暂停。之后,在Cleanup阶段导致暂停之前,可能还会发生young-only垃圾收集。在Cleanup阶段引发的暂停之后,将会进行最终young-only阶段垃圾收集。在空间回收阶段,可能会出现一系列的混合收集(即图中的红色圆圈)。G1收集器在进行空间回收时为了尽可能提高效率,young-only阶段中的混合垃圾收集暂停通常少于young-only暂停。

下面的列表详细描述了G1垃圾收集周期的各个阶段、它们引发的暂停以及阶段之间的转换细节:

  1. Young-only阶段:该阶段开端,G1会进行一系列普通年轻代垃圾收集,将年轻代的对象提升到老年代。当老年代的占用率达到某个阈值(即初始堆占用率阈值)时,Yong-only阶段到空间回收阶段的转换就开始了。此时,G1收集器启动名为Concurrent Start的年轻代垃圾收集。

    • Concurrent Start: 此类收集除了会执行一次普通的年轻代垃圾收集外还会启动标记过程。并发标记会找出老年代中所有后续空间回收阶段中应保留的当前可达(活动)对象。在标记进行过程中可能会发生普通的年轻代收集。两个需要全局停止的操作(Remark和Cleanup)结束后,整个标记过程才宣告结束。

    • Remark:该过程会处理全局引用信息、执行类卸载、回收完全处于空闲状态的子内存区域、清理内部数据结构。在Remark和Cleanup之间,G1收集器会收集信息,以便之后能够以并发的方式回收选定的老年代区域中的空闲空间(该过程最终在Cleanup暂停中完成)。

    • Cleanup:该过程决定了之后是否进入空间回收阶段。如果进入空间回收阶段,则会以一个Prepare Mixed年轻代收集结束Yong-only阶段。

  2. Space-reclamation phase:该阶段由多个混合垃圾收集组成。除了年轻代子区域外,此阶段还会转移老年代子区域集合中的活动对象。当收集器认为转移更多的老年代子区域无法产生足够的空闲空间时,此段就结束了。

空间回收阶段结束之后,垃圾收集周期从另一个Young-only阶段重新开始。如果在应用程序收集活动对象信息时内存耗尽,G1收集器会像其他收集器一样立即停止所有应用线程,执行全堆垃圾收集(full GC)。

本文为此页面译文

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

推荐阅读更多精彩内容