图文超详解 G1 垃圾收集器深入剖析


图文超详解 G1 垃圾收集器深入剖析

文章插图
G1(Garbage First)垃圾收集器是目前垃圾回收技术最前沿的成果之一 。
G1 同 CMS 垃圾回收器一样,关注最小时延的垃圾回收器,适合大尺寸堆内存的垃圾收集 。但是,G1 最大的特点是引入分区的思路,弱化了分代的概念 , 合理利用垃圾收集各个周期的资源,解决了其他收集及 CMS 的很多缺陷 。
官方推荐使用 G1 来代替 CMS 。
通过本篇,我们可以了解掌握 G1 收集器的基本概念、堆内存、回收流程、GC模式、推荐用例等核心知识 。
图文超详解 G1 垃圾收集器深入剖析

文章插图
目录
  • G1 收集器概述
  • G1 的堆内存算法
    • 1. G1 之前的 JVM 内存模型
    • 2. G1收集器的内存模型
  • G1回收流程
    • 1. G1 收集器的阶段(步骤)
  • G1 的 GC 模式
    • 1. YoungGC 年轻代收集
    • 2. mixed gc
  • G1 的推荐用例
G1 收集器概述HotSpot 团队一直努力朝着高效收集、减少停顿 (STW: Stop The World) 的方向努力,贡献了从串行 Serial 收集器、到并行收集器 Parallerl 收集器,再到 CMS 并发收集器 , 乃至如今的 G1 在内的一系列优秀的垃圾收集器 。
G1(Garbage First) 垃圾收集器,是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方推荐选择使用 G1 来替代 CMS。
1.  G1 收集器的最大特点
  • G1最大的特点是引入分区的思路,弱化了分代的概念 。
  • 合理利用垃圾收集各个周期的资源,解决了其他收集器、甚至 CMS 的众多缺陷 。
2.  G1 的改进(相比较 CMS ) 
  • 算法: G1 基于标记--整理算法, 不会产生空间碎片,在分配大对象时,不会因无法得到连续的空间,而提前触发一次 FULL GC。
  • 停顿时间可控: G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象 。
  • 并行与并发:G1 能更充分的利用 CPU 多核环境下的硬件优势,来缩短 stop the world 的停顿时间 。
3. CMS 和 G1 的区别
  • CMS 中 , 堆被分为 PermGen , YoungGen , OldGen ;而 YoungGen 又分了两个 survivo 区域 。在 G1 中,堆被平均分成几个区域 (region) ,在每个区域中,虽然也保留了新老代的概念,但是收集器是以整个区域为单位收集的 。
  • G1 在回收内存后,会立即同时做合并空闲内存的工作;而 CMS ,则默认是在 STW(stop the world)的时候做 。
  • G1 会在 Young GC 中使用;而 CMS 只能在 O 区使用 。
4.  G1 收集器的应用场景目前,CMS 还是默认首选的 GC 策略 。
G1 垃圾收集算法,主要应用在多 CPU 大内存的服务中,在满足高吞吐量的同时 , 尽可能的满足垃圾回收时的暂停时间 。
在以下场景中,G1 更适合:
  • 服务端多核 CPU、JVM 内存占用较大的应用(至少大于4G);
  • 应用在运行过程中,会产生大量内存碎片、需要经常压缩空间;
  • 想要更可控、可预期的 GC 停顿周期,防止高并发下应用雪崩现象 。
G1 的堆内存算法1.  G1 之前的 JVM 内存模型
图文超详解 G1 垃圾收集器深入剖析

文章插图
  • 新生代:伊甸园区 (eden space) + 2个幸存区
  • 老年代
  • 持久代 (perm space):JDK1.8 之前
  • 元空间 (metaspace):JDK1.8 之后取代持久代
2. G1收集器的内存模型
图文超详解 G1 垃圾收集器深入剖析

文章插图
2.1  G1 堆内存结构堆内存会被切分成为很多个固定大小区域(Region) , 每个是连续范围的虚拟内存 。
堆内存中一个区域 (Region) 的大?。梢酝ü?-XX:G1HeapRegionSize 参数指定,大小区间最小 1M 、最大 32M  , 总之是 2 的幂次方 。
默认是将堆内存按照 2048 份均分 。
2.2  G1 堆内存分配每个 Region 被标记了 E、S、O 和 H,这些区域在逻辑上被映射为 Eden,Survivor 和老年代 。
存活的对象从一个区域转移(即复制或移动)到另一个区域 。区域被设计为并行收集垃圾,可能会暂停所有应用线程 。如上图所示,区域可以分配到 Eden,survivor 和老年代 。
此外,还有第四种类型,被称为巨型区域(Humongous Region) 。
【图文超详解 G1 垃圾收集器深入剖析】Humongous 区域主要是为存储超过 50% 标准 region 大小的对象设计,它用来专门存放巨型对象 。如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区来存储 。为了能找到连续的 H 区,有时候不得不启动 Full GC。

推荐阅读