JJava 知识库
JAVA INTERVIEW

高频面试题

JVM高级约 1 分钟

接口 RT 出现周期性尖刺,确认和 GC 有关,你会如何建立基线并逐步调优?

参考回答约 1 分钟 · 口语表达
我的判断

GC 调优先建立“流量—分配—堆占用—暂停—RT”基线,先修对象生命周期,再一次只改一个参数。

确认尖刺和 GC 时间重合后,我会从 GC 日志与 JFR 看是哪类事件:Young GC 太频繁、Mixed 回收跟不上、Full GC、humongous allocation,还是并发标记抢 CPU。还会比较 GC 前后 Old 区,如果每次回收后基线持续上升,更像泄漏或缓存无界。

处理顺序不会从复制网上参数开始:

  1. 找分配热点和异常晋升,先改代码、批量大小或缓存;
  2. 检查堆是否过小或容器没有 native 余量;
  3. 再根据目标调整暂停目标、并发线程或区域相关参数;
  4. 用同一流量回放,并包含发布预热和峰值阶段。

每次只改一类变量,比较 P99、GC CPU、吞吐、Old 占用和 Full GC。平均暂停下降但 CPU 打满、业务吞吐变低,不算调优成功。

容易答偏踩坑误区
  • 只盯单次最大停顿。 频繁小停顿和并发 GC 抢 CPU 同样会推高尾延迟。
  • 把堆越调越大。 容器 native 余量不足时会从 JVM OOM 变成直接 OOMKill。
  • 一次改十个参数。 指标好了也不知道是哪一项生效,回滚困难。