跳到正文
Elaine Blog
返回

AOT、GraalVM Native Image 与 CRaC

Spring 生态与源码

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 选型,完成框架决策。


分享这篇文章:

上一篇
Reactor 与 Spring WebFlux:背压、线程切换和阻塞边界
下一篇
Spring、Jakarta EE、Quarkus 与 Micronaut 选型