首页/开发/软件测试速查/GC 与延迟尖峰

GC 与延迟尖峰

JVM 应用的 GC 常是延迟尖峰来源:关注停顿频率与时长、堆占用曲线、晋升与元空间;调优前先用 GC 日志确认停顿与业务延迟的时间对应关系。

软件测试速查开发更新于 2026-10-13

GC 瓶颈是什么

性能测试中的 GC 瓶颈指垃圾回收导致应用出现停顿或吞吐下降,典型表现是延迟曲线长尾明显、p99 抖动大、CPU 花在回收上而业务指标没变化。常见诱因是分配过快(大量临时对象)、堆与分代配置不当、对象生命周期错配。排查要以 GC 日志和内存剖面为依据,先确认停顿是主因再谈调参。

基本信息

典型症状吞吐未到瓶颈但延迟毛刺增多,p99 与均值差距拉大
证据来源GC 日志(JVM 可用统一日志参数输出)、监控看板的停顿分布
辅助手段堆直方图、分配速率采样、火焰图找分配热点
常见诱因对象创建过快、缓存无界、大对象频繁复制
参数关注堆大小、新生代比例、回收器选择,改动一次只动一个变量
验证方式压测前后对比相同负载下的停顿次数与时长

典型使用场景

  • 延迟毛刺定位:均值正常但超时集中出现时,先看停顿分布再排查代码。
  • 容量评估:内存水位与回收频率随并发变化,判断扩容还是优化。
  • 版本对比:新版本上线前压测对照 GC 指标,拦截内存回归。
  • 故障复盘:线上 Full GC 频繁导致雪崩时,从日志倒推分配行为。
  • 参数评审:调整堆与回收器前,先量化当前停顿水平作为基线。

现象与可能原因

现象可能原因下一步
p99 尖峰周期出现大对象或高峰分配触发停顿查分配热点与缓存策略
停顿次数多但短新生代过小,回收频繁评估新生代比例
单次停顿极长堆过大或回收器不适配评估回收器与堆配置
回收后水位不降存在内存泄漏或强引用堆积抓堆转储分析引用链
先确认归属:停顿时间与请求毛刺时间线对齐,才能归因于 GC,否则先排查锁与下游。
不要在生产直接试参数:回收器与堆参数在预发用真实负载验证后再上。
代码优化优先于参数优化:降低分配速率通常比调参收益更稳。

易错点

  • 不看日志先调参:基于猜测改堆与回收器,问题照旧还引入新波动。
  • 把 GC 当万能解释:真正瓶颈在数据库或锁竞争,方向一开始就错。
  • 一次改多个变量:效果无法归因,回滚也无从下手。
  • 忽略缓存无边界:本地缓存越积越大,回收压力随运行时长增长。
  • 压测环境与生产配置不一致:结论迁移不到线上,白做功。

数据来源与参考

  • Oracle JDK 官方文档:Unified JVM Logging
  • JDK 官方工具文档(jcmd、jstat)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌