服务刚发布时延迟很高,运行十分钟后恢复正常,可能和 JIT 有什么关系?怎么验证?
我的判断
发布后先慢后快可能是类加载、JIT 编译和缓存预热共同作用,必须分别取证,不能只凭现象认定是 JIT。
新实例刚接流量时,热点方法还在解释执行或低层编译,分支画像和调用点信息也没积累;随后 C1/C2 编译完成,内联等优化生效,延迟就会下降。与此同时连接池、DNS、本地缓存和远端 TLS 也在预热,所以要拆开看。
我会用 JFR 的 Compilation、Code Cache、Class Loading 事件,必要时开启 -Xlog:jit+compilation,把编译时间与接口延迟对齐。若有 deoptimization 或 code cache 接近满,也会出现运行一段时间后再次抖动。
处理上会在健康检查放量前执行有代表性的轻量预热,按比例逐步接流量,并保持足够的滚动发布重叠实例。CDS 可以降低类加载成本,但不会拿全量生产写请求做预热。
关闭 JIT 会让曲线变平,却通常把稳定态性能变得更差。目标是控制预热过程,不是消灭编译。