GC 瓶颈是什么
性能测试中的 GC 瓶颈指垃圾回收导致应用出现停顿或吞吐下降,典型表现是延迟曲线长尾明显、p99 抖动大、CPU 花在回收上而业务指标没变化。常见诱因是分配过快(大量临时对象)、堆与分代配置不当、对象生命周期错配。排查要以 GC 日志和内存剖面为依据,先确认停顿是主因再谈调参。
基本信息
| 典型症状 | 吞吐未到瓶颈但延迟毛刺增多,p99 与均值差距拉大 |
|---|---|
| 证据来源 | GC 日志(JVM 可用统一日志参数输出)、监控看板的停顿分布 |
| 辅助手段 | 堆直方图、分配速率采样、火焰图找分配热点 |
| 常见诱因 | 对象创建过快、缓存无界、大对象频繁复制 |
| 参数关注 | 堆大小、新生代比例、回收器选择,改动一次只动一个变量 |
| 验证方式 | 压测前后对比相同负载下的停顿次数与时长 |
典型使用场景
- 延迟毛刺定位:均值正常但超时集中出现时,先看停顿分布再排查代码。
- 容量评估:内存水位与回收频率随并发变化,判断扩容还是优化。
- 版本对比:新版本上线前压测对照 GC 指标,拦截内存回归。
- 故障复盘:线上 Full GC 频繁导致雪崩时,从日志倒推分配行为。
- 参数评审:调整堆与回收器前,先量化当前停顿水平作为基线。
现象与可能原因
| 现象 | 可能原因 | 下一步 |
|---|---|---|
| p99 尖峰周期出现 | 大对象或高峰分配触发停顿 | 查分配热点与缓存策略 |
| 停顿次数多但短 | 新生代过小,回收频繁 | 评估新生代比例 |
| 单次停顿极长 | 堆过大或回收器不适配 | 评估回收器与堆配置 |
| 回收后水位不降 | 存在内存泄漏或强引用堆积 | 抓堆转储分析引用链 |
先确认归属:停顿时间与请求毛刺时间线对齐,才能归因于 GC,否则先排查锁与下游。
不要在生产直接试参数:回收器与堆参数在预发用真实负载验证后再上。
代码优化优先于参数优化:降低分配速率通常比调参收益更稳。