- 背景和价值
- 一、先明确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短
-
记忆锚点:
- 回收范围:Eden + 1个Survivor(From区)(年轻代就这3块:Eden+From+To,To区是空的,用来存复制的对象)
- 存活对象去向:要么“搬去To区(新Survivor)”,要么“升级去老年代(Old区)”(像年轻人:要么继续在“过渡房”(Survivor),要么攒够钱去“老小区”(Old))
- STW特点:时间短(<100ms)(年轻代对象大多活不久,回收快,停业务影响小)
-
口诀:年轻收Eden+Survivor,活的搬To或升Old,STW短得像眨眼。
2. 并发标记周期(Concurrent Marking)——“先标根,再并行,最后修错排价值”
核心特征:分4步,2次短STW,中间和用户线程并行(重点记“哪步STW、哪步并发”)
-
记忆锚点(按顺序记,像“查人口流程”):
- 初始标记(STW):快速标“GC Roots直接引用的对象”(比如“先找小区里的‘户主’(Roots),直接记他们的名字”,快,所以STW)
- 并发标记(无STW):和用户线程“一起干活”,顺着户主找“他们的家人”(存活对象)(比如“户主自己报家人,同时物业(用户线程)继续处理日常,不停工”)
- 最终标记(STW):修正“并发标记时变动的引用”(比如“刚才报家人时,有人搬进来/搬走了,再快速核对一遍”,短STW)
- 清理(STW):统计所有Region的“回收价值”(比如“算每栋楼拆了能腾出多少空间,按‘性价比’排序”)——注意:这步只“统计排序”,不实际回收!
-
口诀:初始标根STW,并发扫活不停车,最终修错再STW,清理排序做准备。
3. 混合回收(Mixed GC)——“混合混,老少挑贵的收”
核心特征:G1的“主力回收”,既收年轻代,也收老年代的“高价值Region”
-
记忆锚点:
- 回收范围:所有年轻代Region + 部分老年代/Humongous Region(大对象区)(“老少通吃,但不贪多”,只收“拆了划算”的老年代Region)
- 触发条件:老年代Region占比≥45%(默认值,参数是
-XX:InitiatingHeapOccupancyPercent
)(像“老小区占比超一半,该拆几栋腾空间了”) - STW特点:和Young GC类似,时间短(因为只收部分老年代,不是全收)
-
口诀:混合回收老少区,年轻全收老挑贵,老代超45%就触发,STW短得能接受。
4. Full GC(备用机制)——“备用惨,单线程停久要避免”
核心特征:G1的“兜底方案”,性能差,尽量避免(记“为什么触发、有多差”)
-
记忆锚点:
- 触发原因:两种情况逼得没办法了——
- Mixed GC速度跟不上“对象分配速度”(比如“拆楼速度赶不上新搬来的人,小区满了”)
- 没有足够空Region可用(“没空地给新对象住了”)
- 执行特点:单线程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是“小区暂时不让进出”,会更易记。