Skip to content

拷问记录:JIT 和 AOT

  • 时间:2026-06-08 09:27
  • 得分:60/100
  • 状态:⏸️ 主动中止
  • 知识点来源:[[JIT 和 AOT]]

题目与复盘

1. JIT 和 AOT 的基础概念与痛点

  • 用户回答摘要:准确回答出 JIT 在运行期编译热点代码,AOT 在编译期编译提速,解决微服务启动慢问题。
  • 缺失点:无,回答精准。
  • 推荐答案与项目口径:JIT 运行时找出热点代码编译为机器码,解决纯解释执行慢的痛点。AOT 运行前一次性编译为本地可执行文件,解决 Java 启动慢、预热开销大的痛点(例如苍穹外卖项目通过 GraalVM AOT 实现瞬时启动)。

2. 峰值性能对比与动态特性限制(触发中止与追问)

  • 用户疑问:既然 AOT 把所有代码都编译成了机器码,为什么极限性能不如 JIT?
  • 推荐答案与项目口径
    • 峰值性能(PGO与内联):JIT 拥有运行时上下文数据(Profile-Guided Optimization)。它可以观察程序的真实运行情况,执行极限的“激进优化”(如:发现某个接口 99% 都是某个特定实现类,就直接“去虚化并内联”代码,省去方法调用开销)。AOT 在编译期处于“盲盒”状态,缺乏运行时数据,只能做保守、平庸的通用编译。
    • 动态特性限制(闭世界假设):AOT 基于**“闭世界假设”(Closed-world assumption)**,打包时必须确定所有代码路径。而 Java 的反射、动态代理是在运行期动态在内存里“无中生有”生成字节码的。AOT 编译时根本看不见这些未来的代码,所以运行时一旦碰到反射就会报错,必须提前写死配置文件告诉 AOT。

下次复习动作

  • 重点理解 JIT 的“运行时激进优化(去虚化、方法内联)”和 AOT 的“闭世界假设”。