标准答案
- 解释执行启动快但单次执行成本较高,JIT 编译需要收集运行信息并付出编译成本。
- 热点方法可能被内联、消除边界检查或进行逃逸分析,但优化假设失效时可能反优化。
- 基准测试要预热、避免死代码消除并区分吞吐、延迟和启动时间。
- 生产问题要结合编译日志、CPU profile 和请求生命周期,不能只看源码复杂度。
题目解析
解释执行让代码快速启动,JIT 通过运行时类型和调用频率识别热点并编译优化。优化可能带来内联、边界检查消除和逃逸分析,但假设失效时也可能反优化,导致性能随输入和阶段变化。
基准测试要区分冷启动、预热和稳态,并防止死代码消除、常量折叠和测试框架误差。生产服务还要考虑请求分布、GC、线程池和下游等待。
final、private 等修饰符可能帮助编译器判断,但不等于一定内联。最终结论应来自 JMH、编译日志、profile 和端到端指标,而不是源码直觉。
常见误区
- 误区:用冷启动一次结果代表稳态性能。改正:分别测启动、预热和稳态,并说明测试目标。
- 误区:认为 final 或 private 就一定内联。改正:内联由 JIT 预算、调用热度和运行时类型等共同决定,需用证据验证。
- 误区:只用手写循环微基准决定生产架构。改正:用接近真实输入和调用链的压测、profile 与资源指标验证。