Skip to content

GC事件类型介绍

1. GC事件

  • “GC 事件类型”通常指 一次 GC 周期在日志里的事件名称与语义,它和“GC 收集器类型”(Serial、Parallel、G1、ZGC 等)是两层概念。
  • 识别 GC 事件最常用的三个维度:回收范围(Young / Old / Mixed / Full)、停顿性质(STW 或并发)、触发原因(Allocation Failure、Metadata Threshold、System.gc() 等)。
  • 同一个 JVM、同一个收集器下,“事件名称”与“触发原因”经常一起出现;排查时优先回答:是什么事件、为什么发生、停顿在哪里、下一步看什么指标

2. 什么是 GC 事件

2.1 GC 事件与 GC 阶段(phase)

在 GC 日志语境下,“GC 事件”可以理解为:一次可被唯一标识的 GC 行为(可能包含多条日志),它内部由多个阶段组成。

  • 事件(event):对外可观测的一次 GC 行为,例如一次 Young GC、一次 Mixed GC、一次 Full GC、一次并发标记周期。
  • 阶段(phase):事件内部的步骤,例如 Initial Mark、Remark、Evacuation、Cleanup 等。

2.2 STW(Stop-The-World)与并发

  • STW:应用线程在安全点(safepoint)暂停,GC 线程独占执行关键工作。事件名里常带 Pause,或日志里直接体现 pause time。
  • 并发:GC 线程与应用线程同时运行,通常用“并发标记”“并发清理”“并发转移”等术语描述。并发阶段也可能夹杂短暂 STW。

3. 事件分类的三个维度

3.1 按回收范围分类

3.1.1 Young GC(Minor GC)

只回收新生代(或等价的“年轻对象区域”)。典型特征:

  • 发生频率高,单次停顿通常短。
  • 主要由分配压力驱动:Eden(或等价空间)不足时触发。

3.1.2 Old GC(Major GC)

只回收老年代的行为在不同收集器里语义不完全一致,面试里建议这样表述:

  • “Major GC / Old GC”通常指 以老年代为主的回收,但它不一定等价于“整堆回收”。
  • 具体是否“只收老年代”取决于收集器实现与日志口径。

3.1.3 Mixed GC

常见于 G1:一次事件同时回收年轻区域与“部分老年代区域”。典型特征:

  • 通常发生在完成一轮并发标记之后,用于逐步回收可回收的老年代 Region。
  • 是否进入 Mixed 以及 Mixed 的次数,与老年代占用、回收收益评估、停顿目标有关。

3.1.4 Full GC

整堆级别的回收(通常包含年轻区、老年代,以及部分 JVM 元数据相关区域的整理)。典型特征:

  • 停顿通常显著更长,是线上抖动的高频根因。
  • 常见触发:老年代空间不足、元空间(Metaspace)压力、并发回收失败回退、显式 System.gc() 等。

3.2 按停顿性质分类

  • STW 事件:关注 暂停时间、暂停占比、暂停发生频率。
  • 并发事件:关注 并发周期总耗时、与应用争抢 CPU 的程度、以及是否频繁回退为 STW。

3.3 按触发原因(GC Cause)分类

不同事件名背后往往还会带一个“原因”。常见原因与典型含义如下:

触发原因(常见口径) 常见含义 优先排查方向
Allocation Failure 分配失败导致触发回收 分配速率、年轻代大小、对象生命周期
Promotion Failure / Evacuation Failure 晋升或转移失败(空间/碎片不足) 老年代碎片、可用空间、回收策略回退
Metadata Threshold 元空间达到阈值 类加载数量、动态生成类、Metaspace 配置
System.gc() / Explicit GC 显式 GC 请求 代码路径、框架行为、是否可禁用或改并发
Ergonomics JVM 自适应触发 堆/代大小、停顿目标、吞吐目标与压力
GCLocker Initiated GC JNI 临界区导致需要触发回收 JNI 使用、临界区持有时间、Native 压力

4. 各收集器的常见事件类型

4.1 Serial / Parallel(吞吐优先)

这类收集器的“事件类型”通常可以按回收范围直接回答:

  • Young GC:高频、短暂停顿,主要由分配压力触发。
  • Full GC:低频但代价高,常见于老年代/元空间压力或显式 GC。

排查重点:

  • Young GC 频繁:看分配速率与年轻代大小是否匹配。
  • Full GC 出现:看老年代增长速度、晋升速率、以及元空间是否逼近上限。

4.2 CMS(历史收集器,线上多见于较老 JDK)

CMS 事件通常按“阶段”来描述更贴近源码事实:

  • Initial Mark(STW):标记 GC Roots 直接可达对象。
  • Concurrent Mark(并发):遍历对象图并发标记。
  • Remark(STW):修正并发期间的标记变化。
  • Concurrent Sweep(并发):清理不可达对象。

经典“事件类型”上的风险点:

  • 并发回收跟不上分配与晋升速度时,可能出现回退为更重的回收(排查时重点看并发周期是否被打断、以及老年代增长曲线)。

4.3 G1(服务器场景最常见的事件口径)

G1 的事件通常以“暂停事件(Pause)”与“并发周期(Concurrent Cycle)”两类出现:

  • Young GC:以 “Pause Young” 为核心语义(一次暂停完成年轻区转移与整理)。
  • Mixed GC:以 “Pause Mixed” 为核心语义(一次暂停回收年轻区 + 部分老年代 Region)。
  • 并发标记周期:常见为 “Concurrent Mark Cycle” 类语义,内部包含短暂停顿阶段(如 Remark、Cleanup)与并发阶段。
  • Full GC:通常是回退路径,代价大,需要重点解释“为什么会回退”(例如转移失败、空间不足等)。

排查重点:

  • Pause 时间:主要来自转移(Evacuation)与引用处理(RSet、根扫描等)的成本。
  • Mixed 次数过多或效果差:通常说明老年代存活率高、可回收收益低,或者并发标记触发节奏不合适。

4.4 ZGC / Shenandoah(低延迟收集器)

低延迟收集器的事件类型通常更强调“短暂停顿 + 大部分工作并发化”的结构:

  • 事件里会出现少量 STW 暂停点(通常以 “Pause …” 语义出现),用于切换/初始化关键阶段。
  • 标记、转移/整理等核心工作主要并发执行,整体更关注“并发周期是否跟得上分配与对象存活压力”。

面试回答建议:

  • 先说明它们的目标是把 STW 压到极低,再说明其代价是更复杂的屏障与更强的并发执行,对 CPU 更敏感。