AOT、Native Image 与 CRaC 解决的不是同一层问题。选择前先定义目标:冷启动时间、常驻内存、峰值吞吐、构建时长、镜像可移植性或弹性扩容速度。
Table of contents
Open Table of contents
三条路线
| 路线 | 做什么 | 主要代价 |
|---|---|---|
| Spring AOT | 构建期生成 Bean 注册和运行提示 | 动态配置受约束,构建增加步骤 |
| Native Image | 闭世界分析后生成平台原生可执行文件 | 构建慢、反射与动态代理需提示 |
| CRaC | 保存已启动 JVM 检查点,再恢复 | 资源需检查点前关闭、恢复后重建 |
AOT 可以服务于 JVM 启动优化,也为 Native Image 提供闭世界元数据。Native Image 不包含传统 JVM 即时编译路径,峰值性能需要实测。
构建原生镜像的入口
实验项目以 Boot parent 管理依赖。具备 GraalVM 或 Docker 环境后可增加 native build tools,再执行:
mvn -Pnative native:compile
本仓库的常规测试不假装验证原生镜像,因为当前门禁没有 GraalVM native-image。Spring Boot 官方提供原生镜像构建指南。
反射和资源为什么需要提示
闭世界分析只保留构建期可达代码。运行时按字符串反射加载的类、动态代理接口、资源文件和序列化类型可能无法自动发现,需要 RuntimeHints 或可达性元数据。
测试必须覆盖冷门路径,如错误序列化、插件实现和条件配置。只验证首页会让缺失提示留到生产。
CRaC 的资源协议
检查点前不能原样保存外部 TCP 连接、文件锁、随机性和过期凭证。组件需要在 checkpoint 回调中暂停并释放,在 restore 后重建连接、刷新密钥和校准时间。
检查点镜像可能包含内存中的敏感数据,必须像生产密钥材料一样保护。
用矩阵测量而不是猜测
对 JVM、JVM+AOT、Native 和 CRaC 分别测量构建时间、镜像大小、冷启动、RSS、吞吐、P99 和故障恢复。再把 CI 成本、调试工具与团队能力写入 ADR。
下一步
阅读Spring、Jakarta EE、Quarkus 与 Micronaut 选型,完成框架决策。