24-一步一图带你理清G1垃圾回收流程

简介: G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。

G1垃圾回收流程

G1的垃圾回收流程主要是从新生代回收开始,新生代回收与并发标记再到混合回收,接下来我们就先来说第一个新生代回收。

G1 Yong Collection

当我们的程序启动刚开始的时候会默认分配新生代5%的空间,这里我们假设分配了8个Region给Eden,1个Region给Survior(只是为了画图方便,实际可能Eden对应了有好几十甚至上百个Region),那么对应的初始内存分配如下:

那么当我们的Eden区域装满,还是会触发新生代的GC,那么新生代的GC还是会通过复制算法来进行垃圾回收,同时系统进入“Stop the World”状态,然后把Eden区中的对应的Region里存活的对象拷贝到S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象。

那么新生代对象什么时候进入老年代呢?跟之前一样,还是这么几个条件:
1)对象在新生代躲过了多次的垃圾回收,达到了一定的年龄,就会进入老年代。可以通过参数“-XX:MaxTenuringThreshold”进行年龄的设置

2)动态年龄规则判断,如果一旦发现某个新生代GC过后,同年龄的存活对象超过了Survior的50%,比如此时有1岁的,2岁的,3岁的,5岁的,发现3岁的对象大小总和已经超过了Survior的50%。那么3岁及以上的对象都会全部进入老年代

所以经过一段时间新生代的使用和垃圾回收后,总有一些对象会进入老年代,如下图:

此时大家可能会疑惑?之前不是说我们有大对象根据JVM的空间担保原则也会直接进入老年代吗?

实际根据G1的分配原则,G1会提供专门的Region来存放大对象,而不是让大对象直接进入老年代的Region中,G1中如何判断大对象是根据Region的大小来的,如果一个对象的大小已经超过Region大小的50%了,那么就会被放入大对象专门的Region中,这种Region我们叫humongous,如下图:

那肯定会有人问了,这个humongous区域的大对象什么时候被回收呢?它既不属于新生代与不属于老年代,什么时候触发垃圾回收进行回收?

其实很简单,在新生代和老年代回收的时候,就会顺带着对大对象一并回收了,所以这就是G1内存模型下对大对象的分配和回收的策略。

注意:

在G1进行新生代垃圾回收的同时还会做一件事情就是“初始标记”::仅仅只是标记一下GC Roots能直接关联到的对象,为下一阶段并发标记做准备(跟之前的CMS垃圾回收过程类似)

G1 Yong Collection + Concunrrent Mark

当G1新生代垃圾回收结束后,紧接着开始进入并发标记阶段:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。

而且JVM会对并发标记阶段对对象做出的一些修改记录起来,比如哪个对象被新建了,哪个对象失去引用了,如下图:

G1 Mixed Collection

G1有一个参数:“-XX:InitiatingHeapOccupancyPercent”,默认值是45%

也就是说,当老年代的大小占据了堆内存的45%的Region时,此时就会触发一个新生代和老年代的混合回收阶段,对E S 0 H进行全面回收

该阶段一旦触发会导致系统进入STW,同时进行最后一个标记:

  • 最终标记阶段:会根据并发标记阶段记录的对象修改,最终标记哪些对象是存活,哪些对象是垃圾

此时老年代也是根据标记-复制算法来进行回收的,会将标记存活的对象拷贝到新的Region中作为老年代区域:


注意我们上面说过一个参数:-XX:MaxGCPauseMillis=time 指定收集的停顿时间,默认是200ms

由于混合回收是一个比较耗时的操作,那么根据G1的特点可以指定收集停顿时间,为了保证停顿时间这个目标,JVM会从新生代、老年代、以及大对象H区挑选一部分Region进行拷贝回收,如果回收不完,后续再进行回收,一部分一部分回收直到回收完毕。但是一次回收停顿的时长保证再200ms。

这里有一个参数:“-XX:G1MixedGCCountTarget”,可以设置在一次混合回收的过程中,最后一个阶段执行几次混合回收,默认值是8次!这样设置的目的也是能让每次回收停顿的时长记得到保证同时又能间隙的让系统接着运行。

同时还有一个参数:“-XX:G1HeapWastePercent”,默认值是5%,意思是当混合回收的时候,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收。

Full GC

当在进行混合回收的过程中,由于无论是新生代还是老年代都是基于复制算法进行的,都需要将各个Region中的存活对象拷贝到别的Region中,此时如果一旦出现拷贝的过程中发现没有空闲的Region可以进行存储了,就会触发一次失败!那么这个时候系统会立马切换为我们的Seiral收集器进行单线程的标记、清理和压缩整理,该过程就变得非常的慢了!

这里我们可以小结下各个收集器的FullGC:

  • SerialGC

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足发生的垃圾收集 - full gc

  • ParallelGC

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足发生的垃圾收集 - full gc

  • CMS

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足,触发Concurrent Mode Failure时触发Full GC

  • G1

    新生代内存不足发生的垃圾收集 - minor gc

    老年代内存不足,无多余Region可供拷贝,触发FullGC

Raymon
+关注
目录
打赏
0
0
0
0
182
分享
相关文章
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
G1原理—5.G1垃圾回收过程之Mixed GC
本文介绍了G1的Mixed GC垃圾回收过程,包括并发标记算法详解、三色标记法如何解决错标漏标问题、SATB如何解决错标漏标问题、Mixed GC的过程、选择CollectSet的算法
G1原理—5.G1垃圾回收过程之Mixed GC
G1原理—4.G1垃圾回收的过程之Young GC
本文详细解析了G1垃圾回收器中YGC(Young Generation Collection)的完整流程,包括并行与串行处理阶段。内容涵盖YGC相关参数设置、YGC与Mixed GC及FGC的关系、新生代垃圾回收的具体步骤(如标记存活对象、复制到Survivor区、动态调整Region数量等),以及并行阶段的多线程操作和串行阶段的关键任务(如处理软引用、整理卡表、重构RSet)。
G1原理—4.G1垃圾回收的过程之Young GC
G1原理—3.G1是如何提升垃圾回收效率
本文深入探讨了G1垃圾回收器提升GC效率的核心机制,包括记忆集(RSet)、位图(BitMap)和卡表(CardTable)的设计与作用。记忆集通过记录跨代引用避免了不必要的老年代遍历,位图用于高效描述内存使用状态以优化标记过程,而卡表则在节约记忆集内存的同时提供更详细的引用信息。此外,文章还解析了DCQ(Dirty Card Queue)和DCQS(Dirty Card Queue Set)机制如何异步更新RSet,确保在高并发场景下的性能与准确性。这些设计共同提升了G1在标记、清理及整理内存时的效率。
158 10
JVM实战—5.G1垃圾回收器的原理和调优
本文详细解析了G1垃圾回收器的工作原理及其优化方法。首先介绍了G1通过将堆内存划分为多个Region实现分代回收,有效减少停顿时间,并可通过参数设置控制GC停顿时长。接着分析了G1相较于传统GC的优势,如停顿时间可控、大对象不进入老年代等。还探讨了如何合理设置G1参数以优化性能,包括调整新生代与老年代比例、控制GC频率及避免Full GC。最后结合实际案例说明了G1在大内存场景和对延迟敏感业务中的应用价值,同时解答了关于内存碎片、Region划分对性能影响等问题。
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
如何解读 jstat 工具输出的 G1 垃圾回收器性能数据?
如何解读 jstat 工具输出的 G1 垃圾回收器性能数据?
使用jstat工具来监控G1垃圾回收器的性能
使用jstat工具来监控G1垃圾回收器的性能
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问