了解 Aot 技术
1、Java Aot
Aot 是 Ahead-Of-Time 的缩写,大家都知道 Java 是一个半编译、半解释型语言。它把 Java 文件编译成 class 文件,之后 JVM 解释执行 class 文件,JVM 可以把 class 文件解释为对应的机器码,这个就是所谓的 JIT。Aot 则是直接把 class 文件编译系统的库文件,不在依靠 JIT 去做这个事情。
- 好处是:
内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中
- 坏处是:
无运行时性能加成,不能根据程序运行情况做进一步的优化,程序运行前编译会使程序安装的时间增加
2、Solon Aot
Solon Aot 是 Solon Native 的关键技术,参与了 Java Aot 的部分生成命周期。它在编译时,将所有框架可探测到的:
- 动态类代理预编译为Java代码(否则是由Asm字节码生成)
- Jdk 代理接口进行元信息登记
- 反射类进行元信息登记
- 资源文件进行元信息登记
- 等
大概的编译过程:
- 常规编译
- 编译时执行 SolonAotProcessor(solon-aot 里的处理类)
- 会启动程序(通过程序的自然运行,收集容器信息、原生元信息等)
- 编译时生成动态类代理并编译为class文件
- 编译为原生程序
3、RuntimeNativeRegistrar
Solon Aot 在自动处理之外,还提供了重要一项目定制接口"RuntimeNativeRegistrar":
public interface RuntimeNativeRegistrar {
void register(AppContext context, RuntimeNativeMetadata metadata);
}
用于在 SolonAotProcessor 执行时,添加无法自动处理的元信息登记。
4、NativeDetector
Solon 内核还提共了一个环境探测工具(用于开发时,做编码控制):
- isAotRuntime(),是否为 Aot 运行时
- inNativeImage(),是否在原生镜像上执行