Evacuation Pause 是 G1 正常回收必经的 STW 转移阶段,所有应用线程暂停,存活对象被复制到新 Region,同时完成清理与整理;它分 young、mixed 两种模式,耗时直接影响用户延迟,其健康度取决于频率、单次耗时和回收效率三者自洽。

Evacuation Pause 就是 G1 的 STW 转移暂停
它不是某种“异常状态”,而是 G1 正常执行回收时必经的核心阶段:所有应用线程被暂停(STW),G1 把选中的 Region 里存活的对象复制(evacuate)到新的空闲 Region 中。这个动作同时完成垃圾清理和内存整理,避免 CMS 那种碎片化问题。
常见错误现象:GC pause (G1 Evacuation Pause) (young) 日志频繁出现、单次 real=xxx secs 时间偏长、GC Workers 数量远低于预期 CPU 核数——这些都不是 Evacuation Pause 本身出错,而是背后资源或配置没跟上。
- 它只在 G1 启用后出现,Parallel GC 或 ZGC 日志里不会看到这个词
-
(young)表示本次只处理年轻代 Region;(mixed)表示还捎带处理了一部分老年代 Region;没有括号修饰的Evacuation Pause极少见,通常意味着日志被截断或解析工具误读 - Evacuation 过程必须全程 STW,所以它的耗时直接决定用户感知的延迟。G1 的“软实时”能力,本质上就是靠控制每次 Evacuation Pause 的工作量来实现的
为什么 Eden 清零了,Survivor 却没变甚至涨了
这恰恰说明 Evacuation Pause 正在按设计工作:Eden 区所有存活对象被复制走,但目标可能是 Survivor 区,也可能是老年代(尤其当对象年龄达标、或 Survivor 空间不足时)。
典型场景:[Eden: 1024M(1024M)->0B, Survivors: 128M->128M, Heap: 1840M->820M] —— Eden 归零,Survivor 没变,但堆整体降了 1GB,说明大量对象直接晋升到了老年代 Region。
- Survivor 空间不变 ≠ 没有对象进入,可能刚腾出空间又填满,也可能 G1 判定晋升更划算(比如 Survivor 区太小、或对象太大放不下)
- 如果连续几次都看到
Survivors: X->X且Heap回收量越来越小,大概率是对象存活率高,或者-XX:MaxTenuringThreshold设置过低,导致提前晋升 - G1 不强制维持传统 Survivor 翻转逻辑,它会动态分配任意空闲 Region 当作新的 Survivor,所以 Survivor 大小波动比 Parallel GC 更平滑,但日志里只显示逻辑总量
Evacuation Pause 耗时高的真实原因往往不在 GC 本身
别急着调 -XX:MaxGCPauseMillis,先看日志里 Times: user=..., real=... 的拆分。如果 real 远大于 user + sys,说明瓶颈在系统层面,不是 GC 算法慢。
- 典型干扰项:CPU 被其他进程抢占、容器 cgroup 限频、NUMA 跨节点内存访问、磁盘 I/O 导致 GC 线程调度延迟
-
GC Workers: 4显示并行线程数,但如果机器只有 2 核,实际并发度就受限;检查Runtime.getRuntime().availableProcessors()输出是否与物理核数一致 - 大对象(Humongous Object)触发的
GC pause (G1 Humongous Allocation)也会归类为 Evacuation Pause,但它不走常规复制路径,而是直接分配专属 Region 并可能引发额外扫描,这类暂停容易被误判为普通 YGC
如何快速判断 Evacuation Pause 是否健康
盯住三组数字:频率、单次耗时、回收效率。它们之间要能自洽,否则参数就失配了。
- 频率太高(比如 -Xmn 和业务对象创建节奏
- 单次耗时超标但频率低:可能是单次处理 Region 过多,调低
-XX:MaxGCPauseMillis让 G1 主动减少每次回收集大小 - 回收量持续萎缩(如
Heap: 2000M->1990M):说明对象存活率接近 100%,要么内存泄漏,要么-XX:InitiatingHeapOccupancyPercent设得太低,导致 Mixed GC 过早启动、效果打折
真正容易被忽略的是:Evacuation Pause 的行为高度依赖并发标记阶段的结果。如果日志里长期看不到 initial-mark 或 remark,说明并发标记没跑起来,G1 会一直卡在 fully-young 模式,无法进入 Mixed GC,老年代压力只会越积越大。


















