文章目录

  • G1收集器
    • 概念
    • 设计思路
    • 设计原理
    • 执行步骤:

G1收集器

概念

G1(Garbage First)是一款主要面向服务端应用的垃圾收集器,JDK 9发布之日,G1宣告取代ParallelScavenge加Parallel Old组合,成为服务端模式下的默认垃圾收集器,而CMS则沦落至被声明为不推荐使用(Deprecate)的收集器。

G1收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。

设计思路

虽然G1也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:

  • G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。

收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

设计原理

Region中还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。

每个Region的大小可以通过参数 -XX:G1HeapRegionSize设定,取值范围为1MB~32MB,且应为2的N次幂。

而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的 Humongous Region 之中,G1的大多数行为都把 Humongous Region 作为老年代的一部分来进行看待

如下图所示:

虽然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它们都是一系列区域(不需要连续)的动态集合。

G1收集器之所以能建立可预测的停顿时间模型,是因为它将Region作为单次回收的最小单元,即每次收集到的内存空间都是Region大小的整数倍,这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集。

更具体的处理思路是让G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XX:MaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region,这也就是“Garbage First”名字的由来。这种使用Region划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率。

执行步骤:

如果我们不去计算用户线程运行过程中的动作,G1收集器的运作过程大致可划分为以下四个步骤:

  • 初始标记: 仅仅是标记一些GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新的对象。
  • 并发标记: 从GC Roots开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,与用户线程并发执行。
  • 最终标记: 对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。
  • 筛选回收: 负责更新Region的统计数量,对各个Region进行回收价值和成本排序,根据用户期望的停顿时间制定回收计划,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧的Region的全部空间。

下面是G1收集器的运行示意图:

关于 G1(Garbage First)垃圾收集器相关推荐

  1. G1和ZGC垃圾收集器

    文章目录 G1垃圾收集器 定义 G1的优势 G1架构 G1 内存布局 G1可以让用户自己设置应用暂停时间,为什么可以做到这一点? G1 缺点 G1 GC模式 G1 Young GC Mixed GC ...

  2. 深入Garbage First垃圾收集器(三)G1中的垃圾收集

    G1 GC在收集暂停的过程中会回收绝大部分堆分区,唯一的例外是多级并发标记期间的清除阶段. 在清除阶段,如果G1遇到仅仅只存放了垃圾的分区,它就会立刻收集这些分区并将它们放回空闲分区列表中,因此这些分 ...

  3. 详解 JVM Garbage First(G1) 垃圾收集器

    前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行 ...

  4. G1垃圾收集器深度剖析

    G1垃圾收集器深度剖析 一.G1垃圾收集器概述 1.1 思考 开始学习前,抛出两个常见面试问题:1.G1的回收原理是什么?为什么G1比传统的GC回收性能好?2.为什么G1如此完美仍然会有ZGC?简单的 ...

  5. JVM优化系列-JVM G1 垃圾收集器

    导语   G1回收器是在JDK1.7中正式使用的一种全新的垃圾回收器,它的目标是为了取代CMS回收器.G1回收器拥有独特的垃圾回收策略,和之前的任意的一种垃圾回收器都有所不同,但是从分代策略上来说依然 ...

  6. G1垃圾收集器全视角解析

    本文来说下G1垃圾收集器 文章目录 概述 GC的分类 串行垃圾回收器 并行垃圾回收器 并发标记扫描垃圾回收器(CMS) G1垃圾收集器 G1垃圾收集器详解 G1分区的概念 G1 中的重要数据结构和算法 ...

  7. JVM性能调优实践——G1 垃圾收集器分析、调优篇

    前言 关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践--G1 垃圾收集器介绍篇.了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略.下文的 ...

  8. Java垃圾回收机制与垃圾收集器

    Java垃圾回收机制与垃圾收集器 前言 判定对象是否存活(标记) 引用计数法 可达性分析 算法思想 算法步骤 对象复活 引用概念的完善 垃圾回收算法 标记 - 清除法 标记 - 复制法 标记 - 整理 ...

  9. Oracle提议将G1作为Java 9的默认垃圾收集器

    Oracle正在考虑将JEP 248包含到Java 9的JEP列表中,即在服务器配置中将G1作为默认垃圾收集器.该决定在Java社区引发了一些争论,许多人都认为并发标记和扫描(CMS)收集器可能更合适 ...

  10. JVM性能调优实践:G1 垃圾收集器介绍篇

    前言 前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇.这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结 ...

最新文章

  1. HTML5中的CSS Shader技术
  2. 理解Promise规范
  3. 水面反光如何拍摄_如何在雨中拍摄,这些技巧会让你的摄影更完美
  4. 冒泡排序的双重循环理解
  5. 【呆萌の研究】JavaScript常见的继承方式
  6. Win10 64位+VS2015+OpenCV3.4.2重编译
  7. 2 Django-2的路由层(URLconf)
  8. 暗黑系博客主题,欢迎访问与魔改,博客网站有搭建教程
  9. 打印系统开发(42)——静默打印
  10. 华为网络模拟器eNSP安装教程
  11. tbslog乱码转换_word 编码 转换器 在线转换器
  12. hihocoder1498 Diligent Robots
  13. 内插滤波器 matlab,多相分解实现内插滤波器.ppt
  14. 杭州 小学计算机比赛,【2019年第二十届全国中小学电脑制作活动】,乐博乐博学员强势晋级杭州市赛!...
  15. pin ——pin tool代码注释 各pin tool的用途
  16. Java面试题集(116-135)
  17. 利用Ancol PCA法将祖源计算器结果与实际情况相结合可视化分析
  18. 【Docker】1、概述:背景、历史、用途
  19. CDS 获取系统日期时间
  20. SpringBoot  启动出现Cannot determine embedded database driver class for database type NONE

热门文章

  1. Perceptual Loss
  2. 超级滥的片子——《见龙卸甲》
  3. 使用StretchBlt之前一定要用SetStretchBltMode(COLORONCOLOR)
  4. 在ubuntu下使用有道词典
  5. python宣传口号,Python会议口号
  6. python语句结尾为何不用分号_Python 不用分号作终止符?为什么
  7. linux下使用命令将doc、docx、ppt文件转成转换图片文件
  8. C编译器02-转换器
  9. 【图像传感器】--- 半导体中的光电转换
  10. 程序员技术练级攻略(陈皓)