压测时为冲高 QPS 把线程池 core 从 50 调到 500,队列从 1000 调到 10000。上线沿用了这份配置,第三天堆内存涨到 7.8G,Full GC 每小时两次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

jcmd 1 VM.flags | tr ' ' '\n' | grep -i thread
grep -n 'corePoolSize\|queueCapacity' application-loadtest.yml

500 个核心线程每个都带 ThreadLocal 缓存和栈空间,常驻内存比 50 个多出几百兆。队列放大后任务堆积不再被拒绝,延迟悄悄上涨。配置改在配置文件里,没有走发布评审。这一点先确认清楚,后面就不用反复试。

「压测配置未回滚」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,压测配置单独放一个 profile 不随包发布;启动时打印关键参数 和基线比对;给线程池和队列长度加监控 超阈值告警;回滚后连续观察三天 确认内存曲线平稳。

改完照着核一遍,线上线程池回到 50/1000,堆内存稳定在 3G 以下,Full GC 不再出现。

作者 9823189