当前位置: 首页 > news >正文

G1垃圾回收过程

目录
  • 背景和价值
      • 一、先明确G1的“基础认知”(记准不混淆的前提)
      • 二、分阶段拆解:每个流程的“记忆公式”
        • 1. 年轻代回收(Young GC)——“年轻轻,快准狠”
        • 2. 并发标记周期(Concurrent Marking)——“先标根,再并行,最后修错排价值”
        • 3. 混合回收(Mixed GC)——“混合混,老少挑贵的收”
        • 4. Full GC(备用机制)——“备用惨,单线程停久要避免”
      • 三、整体串联:一句话记完G1全流程
      • 四、关键对比表(帮你不混淆)
  • 参考资料

背景和价值

回收类型 回收范围 STW情况 回收的触发条件 核心目的/特点
Young GC Eden + 1个Survivor(From区) 短(通常<100ms) 1. Eden区分配对象时空间不足,无法容纳新对象;
2. Survivor区(From)溢出,存活对象需转移/晋升时触发。
快速回收年轻代(对象存活率低),减少内存碎片。
并发标记周期 全堆(仅标记存活对象,不实际回收) 2次短STW(初始标记+最终标记),中间并发无STW 1. 老年代Region占比达到阈值(默认45%,由-XX:InitiatingHeapOccupancyPercent控制);
2. JVM周期性检查堆内存,满足“需统计回收价值”时触发(为后续Mixed GC做准备)。
标记全堆存活对象,统计各Region回收价值(性价比),为混合回收筛选目标。
Mixed GC 全年轻代Region + 部分高价值老年代/Humongous Region 短(类似Young GC,比Full GC短得多) 1. 并发标记周期结束后,满足“老年代回收价值达标”;
2. 老年代Region占比持续高于阈值(或下降缓慢),需进一步释放老年代空间;
3. 默认最多执行8次(可通过参数调整),避免频繁回收老年代。
主力回收流程,平衡年轻代与老年代回收效率,兼顾内存释放与STW时长。
Full GC 全堆(年轻代+老年代+Humongous Region) 长(单线程执行,整理内存碎片) 1. Mixed GC回收速度跟不上对象分配速度(如短时间大量创建对象,堆空间快速耗尽);
2. 无足够空Region容纳新对象/晋升对象(如大对象分配失败);
3. 并发标记周期中出现“老年代占比骤升”,无法通过Mixed GC缓解。
备用兜底机制,回收全堆但性能差,需通过参数优化尽量避免。

要记住G1垃圾回收(GC)过程,核心是提炼各阶段“核心特征”,再用“联想口诀+场景类比”绑定关键信息,避免死记硬背。以下按G1的4个核心回收流程拆解,每个流程都给“记忆锚点”和“通俗类比”,最后串成整体口诀,帮你快速掌握:

一、先明确G1的“基础认知”(记准不混淆的前提)

G1把堆内存分成很多小块(Region),就像“小区里的一栋栋楼”;回收时不按“年轻代/老年代”整块收,而是挑“值得回收的Region”(类似“优先拆老破小,不拆刚装修的楼”)。
所有流程都围绕“尽量短STW、尽量并发”设计,只有万不得已才用Full GC。

二、分阶段拆解:每个流程的“记忆公式”

1. 年轻代回收(Young GC)——“年轻轻,快准狠”

核心特征:只收年轻代、复制存活对象、STW短

  • 记忆锚点:

    1. 回收范围:Eden + 1个Survivor(From区)(年轻代就这3块:Eden+From+To,To区是空的,用来存复制的对象)
    2. 存活对象去向:要么“搬去To区(新Survivor)”,要么“升级去老年代(Old区)”(像年轻人:要么继续在“过渡房”(Survivor),要么攒够钱去“老小区”(Old))
    3. STW特点:时间短(<100ms)(年轻代对象大多活不久,回收快,停业务影响小)
  • 口诀:年轻收Eden+Survivor,活的搬To或升Old,STW短得像眨眼。

2. 并发标记周期(Concurrent Marking)——“先标根,再并行,最后修错排价值”

核心特征:分4步,2次短STW,中间和用户线程并行(重点记“哪步STW、哪步并发”)

  • 记忆锚点(按顺序记,像“查人口流程”):

    1. 初始标记(STW):快速标“GC Roots直接引用的对象”(比如“先找小区里的‘户主’(Roots),直接记他们的名字”,快,所以STW)
    2. 并发标记(无STW):和用户线程“一起干活”,顺着户主找“他们的家人”(存活对象)(比如“户主自己报家人,同时物业(用户线程)继续处理日常,不停工”)
    3. 最终标记(STW):修正“并发标记时变动的引用”(比如“刚才报家人时,有人搬进来/搬走了,再快速核对一遍”,短STW)
    4. 清理(STW):统计所有Region的“回收价值”(比如“算每栋楼拆了能腾出多少空间,按‘性价比’排序”)——注意:这步只“统计排序”,不实际回收!
  • 口诀:初始标根STW,并发扫活不停车,最终修错再STW,清理排序做准备。

3. 混合回收(Mixed GC)——“混合混,老少挑贵的收”

核心特征:G1的“主力回收”,既收年轻代,也收老年代的“高价值Region”

  • 记忆锚点:

    1. 回收范围:所有年轻代Region + 部分老年代/Humongous Region(大对象区)(“老少通吃,但不贪多”,只收“拆了划算”的老年代Region)
    2. 触发条件:老年代Region占比≥45%(默认值,参数是-XX:InitiatingHeapOccupancyPercent)(像“老小区占比超一半,该拆几栋腾空间了”)
    3. STW特点:和Young GC类似,时间短(因为只收部分老年代,不是全收)
  • 口诀:混合回收老少区,年轻全收老挑贵,老代超45%就触发,STW短得能接受。

4. Full GC(备用机制)——“备用惨,单线程停久要避免”

核心特征:G1的“兜底方案”,性能差,尽量避免(记“为什么触发、有多差”)

  • 记忆锚点:

    1. 触发原因:两种情况逼得没办法了——
      • Mixed GC速度跟不上“对象分配速度”(比如“拆楼速度赶不上新搬来的人,小区满了”)
      • 没有足够空Region可用(“没空地给新对象住了”)
    2. 执行特点:单线程STW + 整理内存(像“只有一个工人拆楼,还得把剩下的楼摆整齐”),耗时极长(业务会卡死,必须避免)
  • 口诀:Full GC是备胎,分配太快/没空地才触发,单线程STW超久,能躲就躲别见它。

三、整体串联:一句话记完G1全流程

年轻代快收短STW,并发标记分四步(初标终标STW,中间并发清排序),混合回收挑贵收(老代45%触发),Full GC兜底别出现

四、关键对比表(帮你不混淆)

回收类型 回收范围 STW情况 核心目的/特点
Young GC Eden + 1个Survivor 短(<100ms) 快速回收年轻代
并发标记周期 全堆(只标记,不回收) 2次短STW(初始+最终) 统计Region回收价值
Mixed GC 全年轻代 + 部分老年代 主力回收,平衡效率
Full GC 全堆 长(单线程) 备用机制,尽量避免

通过“先拆每个阶段的核心特征→用口诀绑定→再用表格对比”,就能把G1流程串成“有逻辑的故事”,而不是零散的知识点。记的时候多联想“小区拆楼”的场景,比如Region是“楼”,存活对象是“要留下的住户”,STW是“小区暂时不让进出”,会更易记。

参考资料

http://www.hskmm.com/?act=detail&tid=13195

相关文章:

  • Trellix自动化大规模修复开源漏洞,已修补超6万个项目
  • 爆款游戏背后:尚娱如何借助阿里云 Kafka Serverless 轻松驾驭“潮汐流量”?
  • Vben Admin5.0 keepAlive缓存和onActivated未生效
  • 版本速递 | 华为云Versatile智能体平台 新增特性介绍(2025年9月发布)
  • JVM体系结构
  • PE程序常见脱壳方案
  • 基于二值化断裂裂缝的裂缝拼接算法
  • spring ai基于内存RAG尝鲜
  • 想自己做大模型备案的企业看过来【评估测试题+备案源文件】
  • 基于 IOCP 的协程调度器——零基础深入浅出 C++20 协程
  • Gitee PPM风险矩阵:数字化转型中的项目管理预警雷达
  • 同一个灰色,POI取出来却是白色:一次Excel颜色解析的踩坑记录
  • 坤驰科技携国产化MTCA解决方案,亮相大科学装置控制系统研讨会
  • 找出所有项目引用了哪些 NuGet 包、版本号、对应项目路径,并筛选出“同一个包名但版本不同”的情况。
  • PC与基恩士PLC通信的C#实现
  • Excel 表格技能
  • labelme标注后的json文件和原图同步按角度旋转
  • rk3588的ai功能和deepseek
  • EPSON L1300打印机清零教程
  • 「线性代数」矩阵运算与初等变换
  • 移动号码线上复机
  • Uni-App 使用android studio打包最新教程
  • tomcat CPU数量和线程数的关系
  • NASA运货飞船天鹅座再次推迟,航天任务为什么总是“彩排”不断
  • Centos系统切换为光盘本地源
  • 基于Hilbert-Huang变换(HHT)的模态分解与瞬时频率计算
  • NIO
  • python处理Excel单机小程序:匹数据,增强版VLookup
  • var sql 的不同用法
  • CF623B Array GCD