OpenJDK的G1日志中Evacuation Pause是什么意思

浅芳大大_4776

浅芳大大_4776

2026-10-27

446人浏览

原创

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

openjdk的g1日志中evacuation pause是什么意思

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,老年代压力只会越积越大。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11297

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8402

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7252

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1204

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2969

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20231

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
OpenJDK项目Wiki
OpenJDK项目Wiki

共0课时 | 0人学习

OpenJDK构建指南
OpenJDK构建指南

共0课时 | 0人学习

OpenJDK官网文档
OpenJDK官网文档

共0课时 | 0人学习