专栏首页JVMGCG1垃圾收集器
原创

G1垃圾收集器

G1垃圾收集器简介

image

Garbage First(简称:G1)收集器是垃圾收集器技术发展历史上的一个里程碑,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式.

G1是一款主要面向服务端应用的垃圾收集器,HotSpot开发团队赋予它的期望是未来可以替换掉JDK5中发布的CMS收集器. JDK9发布之日,G1宣布取代了Parallel ScavengeParallel Old的组合,成为服务端模式下默认的垃圾收集器,而CMS则被声明为(Deprecate)使用的收集器.

G1实现了可控停顿时间的垃圾收集器,通过-XX:MaxGCPauseMillis参数进行设置,默认是200ms。

Region简介

G1开创了基于Region的堆内存布局,虽然G1也遵循分代思想,但是堆内存布局和其它垃圾收集的内存布局有着巨大的变化. G1垃圾收集器不再坚持固定大小分代分区,而是把连续的堆内存分成大小一样的独立区域(Region),每一个Region可以根据需要扮演新生代(Eden),Survivor空间,老年代。 G1垃圾收集器可以根据扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象,还是已经存活了一段时间的对象, 或则经历过很多次垃圾收集但是还存活下来的对象,都会有很好的效果。

image-20201124191759545

G1中五种不同的Region

  • 新生代(Eden Region)
  • 年轻代(Survivor Region)
  • 老年代(Old Region)
  • 巨型对象(Humongous Region)
  • 未分配(Free Region)

巨型对象区(Humongous Region)

Region中有一种特殊的Humongous Region,专门用来存储大对象。G1收集器规定只要对象的大小超过了Region大小的一般就会被认为是巨型对象 。每个Region的大小可以通过-XX:G1HeapRegionSize来调整(1MB-32MB,且为2的N次幂)。G1收集器通常把Humongous Region看做老年代的一部分。

对象划分的规则

  • 对象大小小于一半Region,直接存储到标记为Eden的Region
  • 对象大小大于一半Region但是小于一个Region,存储到标记为Humongous的Region中
  • 对象大小超过一个Region大小,存储到标记为Humongous的多个连续Region中

GC类型

  • youngGC:回收Eden区和Survivor区
  • MixedGC:回收所有的新生代和部分老年区
  • FullGC:回收整个堆

Remenbered Set,简称RSet

由于分代的内存不连续,导致GC搜索垃圾对象时,需要扫描整个堆。为了解决这个问题,G1为每个Region都维护了一个Remenbered Set,用来记录对象的引用情况,当GC发生的时候根据Remenbered Set的索引情况去搜索。

Remenbered Set存储的引用关系类型

  • 1.分区内引用
  • 2.新生代分区Y1引用新生代分区Y2
  • 3.新生代分区Y1引用老年代分区O1
  • 4.老年代分区O1引用新生代分区Y1
  • 5.老年代分区O1引用老年代分区O2

youngGC时,GC Root主要是两类,栈空间和老年代到新生代区分的引用(2,3)关系。

MixedGC时,由于只收集老年代区,所以老年代分区引用(4,5)关系将被使用。

G1垃圾收集器执行步骤

初始标记

标记GC Roots能够直接关联的对象(Root Region),修改TAMS指针的值,使的下一阶段用户线程并发运行时,能在正确的Region中分配对象。

需要停顿用户线程,但耗时很短,且借助Minor GC时同步完成。

  • TAMS:Top at Mark Start,Region 中的指针,用于并发标记时为对象分配内存空间。

根分区扫描

拿到初始标记的Root Region,扫描整个堆的所有RegionRset看是否有Root Region,并标记Region

并发标记

遍历上一步标记过的Region对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找到要回收的对象。耗时较长,可以和用户线程并行。

耗时较长,可遇用户线程并行,当对象扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。

重新标记

短暂的暂停用户线程,用于处理并发标记阶段遗留下来最后少量的SATB记录。

筛选回收

负责更新Region的统计数据,对各个Region的回收价值进行排序,根据用户所期待的停顿时间,来制定回收计划,可以自由选择任意组合的Region进行回收,然后将需要回收的Region中的对象复制到空的Region,再清理掉整个旧的Region.这里涉及移动存活对象,所以也要暂停用户线程,由多条收集器线程并行完成。

G1提高效率的有哪些点

  • 使用Rset降低了扫描范围
  • 重新标记阶段使用SATB速度比CMS的增量更快
  • 清理过程中,选择部分回收价值高的Region进行清理(MixedGC),而不是所有的Region提高了清理效率。
wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • G1垃圾收集器

    G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,...

    黑洞代码
  • Garbage First(G1)垃圾收集器

    G1垃圾收集器采用一个略微不同的手段来解决并行、串行以及CMS GC的众多缺陷。G1将堆拆成一系列的分区,这样在一个时间段内,大部分的垃圾收集操作就只是在一个分...

    博文视点Broadview
  • G1垃圾收集器概述

    开始学习前,抛出两个常见面试问题:1.G1的回收原理是什么?为什么G1比传统的GC回收性能好?2.为什么G1如此完美仍然会有ZGC?简单的回顾下CMS垃圾回收机...

    黑洞代码
  • G1垃圾收集器详解(1)

    Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,...

    黑洞代码
  • G1垃圾收集器详解(2)

    G1对内存的使用以分区(Region)为单位,而对对象的分配则以卡片(Card)为单位。

    黑洞代码
  • 深入理解G1垃圾收集器

    Java语言一直使用GC技术进行JVM自动内存管理,避免手动管理带来的一系列问题,以提升开发人员效率。衡量垃圾回收的三个最重要指标:

    肉眼品世界
  • G1垃圾收集器(7)之Mixed GC

    混合回收,会选择所有年轻代区域(Eden/Survivor)(最大年轻代分区数)和部分老年代区域进去回收集合进行回收的模式。年轻代区域对象移动到Survivor...

    黑洞代码
  • G1垃圾收集器(7)之Full GC

    当混合回收无法跟上内存分配的速度,导致老年代也满了,就会进行Full GC对整个堆进行回收。G1中的Full GC也而是单线程串行的,而且是全暂停,使用的是标记...

    黑洞代码
  • G1垃圾收集器(6)之Young GC

    1.完全年轻代GC(fully-young collection),也称年轻代垃圾回收(Young GC)2.部分年轻代GC(partially-young c...

    黑洞代码
  • 详解 JVM Garbage First(G1) 垃圾收集器

    Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,...

    aoho求索
  • 总结G1垃圾收集器面试题

    入门小站
  • 面霸篇:G1 垃圾收集器原理!

    所有的垃圾回收器的目的都是朝着减少STW的目的而前进,G1(Garbage First)回收器的出现颠覆了之前版本CMS、Parallel等垃圾回收器的分代收集...

    码哥字节
  • G1垃圾收集器详解(3)之CSet

    收集集合(CSet)代表每次GC暂停时回收的一系列目标分区。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。因此无...

    黑洞代码
  • G1垃圾收集器(6)之写屏障

    写屏障是指,在改变特定内存的值(实际上也就是写入内存)的时候额外执行的一些动作。在大多数的垃圾回收算法中,都利用到了写屏障。写屏障通常用于在运行时探测并记录回收...

    黑洞代码
  • G1垃圾收集器详解(4)之RSet

    比如在对某个区域进行回收时,首先从GC ROOT开始遍历可直达这些区域中的对象,可由于晋升或者移动的原因,这些区域中的某些对象移动到了其他区域,可是移动之后仍然...

    黑洞代码
  • G1垃圾收集器(10)之mixed gc日志

    黑洞代码
  • G1垃圾收集器详解(5)之Card Table

    在G1 堆中,存在一个CardTable的数据,CardTable 是由元素为1B的数组来实现的,数组里的元素称之为卡片/卡页(Page)。这个CardTabl...

    黑洞代码
  • 关于生产环境改用G1垃圾收集器的思考

    由于我们的业务量非常大,响应延迟要求高。目前沿用的老的ParNew+CMS已经不能支撑业务的需求。平均一台机器在1个月内有1次秒级别的stop the ...

    静儿
  • JVM性能调优实践—G1垃圾收集器全视角解析

    本文将总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结合open-jdk源码分析下重要算法如SATB,重要存储结构如CS...

    王知无-import_bigdata

扫码关注云+社区

领取腾讯云代金券