Solon v3.0.4.1

了解 Aot 技术

</> markdown

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(),是否在原生镜像上执行