我把Solon打包成了native image,速度快的惊人

这篇具有很好参考价值的文章主要介绍了我把Solon打包成了native image,速度快的惊人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Solon 一个高效的应用开发框架:更快、更小、更简单。https://solon.noear.org/

我刚开始对 Solon 感兴趣的原因,就是启动快、包体积小,用了一段时间之后,发现 Solon 使用 GraalVM native iamge 打包有一些问题,我把问题发到 Solon 用户群里,作者告诉我 Solon 的原生编译还 beat 阶段,只做了一部分,问我有没有兴趣,然后我就一边研究 GraalVM naitve image 规范,一边看 Spring 的源码,看看前辈们是怎么实现的,到今天终于在 Solon 上有了阶段性的进展。

我把Solon打包成了native image,速度快的惊人


我把Solon打包成了native image,速度快的惊人

启动耗时13ms,内存占用13.5MB(不同机器启动时间会有所差异)

示例源码地址:https://github.com/dudiao/solon-native-example

什么是 Solon AOT ?

AOT 是 Ahead-Of-Time 的简写,指运行前编译,与之对应的是 JIT,即 Just-In-Time,即时(动态)编译,边运行边编译。


Solon AOT 实际上是指 Solon AOT 优化,帮助 GraalVM 更好的将 Solon 应用编译为本机可执行程序(native image),大体思路是构建时,检查应用上下文,找到被使用的类、方法、字段等,并做出相应的决策。做到这些,需要在构建时启动应用,才能获取到上下文 AopContext,Solon AOT 在处理中,可能会生成:

  • Java 类(通常是动态代理)
  • RuntimeNativeMetadata 运行时元数据,包括反射,资源,序列化等
  • Solon 运行时元数据

使用方式

1. 增加solon.aot和solon.apt依赖

<!--solon native start-->
<!--aot 注册native元信息-->
<dependency>
  <groupId>org.noear</groupId>
  <artifactId>solon.aot</artifactId>
</dependency>
<!-- apt 生成代理类 -->
<dependency>
  <groupId>org.noear</groupId>
  <artifactId>solon.proxy.apt</artifactId>
  <scope>provided</scope>
</dependency>
<!--solon native end-->

2. 注册需要的运行时元数据(可选)

比如 User 类需要序列化,可以这样注册:

@Component
public class MyNativeRegistrar implements RuntimeNativeRegistrar {

  @Override
  public void register(AopContext context, RuntimeNativeMetadata nativeMetadata) {
    nativeMetadata.registerSerialization(User.class);
  }
}

实现RuntimeNativeRegistrar接口,且实现类需要是一个solon bean。

3. 生成为本机可执行程序(native image)

环境要求:graalvm 17 & native-image
如果你的项目中使用solon-parent来管理依赖,比如:

<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>2.2.13-SNAPSHOT</version>
    <relativePath />
</parent>

<groupId>com.dudiao.solon</groupId>
<artifactId>solon-native-example</artifactId>
<version>1.0</version>

直接使用如下命令打包为 native image

mvn clean native:compile -P native

如果你的项目中没有使用solon-parent,可以在pom.xml中增加:

<profiles>
  <profile>
    <id>native</id>
    <build>
      <plugins>
        <plugin>
          <groupId>org.noear</groupId>
          <artifactId>solon-maven-plugin</artifactId>
          <version>${solon.version}</version>
          <executions>
            <execution>
              <id>process-aot</id>
              <goals>
                <goal>process-aot</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.graalvm.buildtools</groupId>
          <artifactId>native-maven-plugin</artifactId>
          <version>${native.version}</version>
          <!-- 使用graalvm提供的可达性元数据,很多第三方库就直接可以构建成可执行文件了 -->
          <configuration>
            <metadataRepository>
              <enabled>true</enabled>
            </metadataRepository>
          </configuration>
          <executions>
            <execution>
              <id>add-reachability-metadata</id>
              <goals>
                <goal>add-reachability-metadata</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

同样使用mvn clean native:compile -P native即可打包为本机可执行程序。

也可以参考 solon native 的示例项目:
https://github.com/dudiao/solon-native-example

实现原理

我把Solon打包成了native image,速度快的惊人


Solon AOT的总体思路是:

  1. 编译时,通过 apt 生成代理类(之后这部分逻辑会迁移到 solon-maven-plugin 中);
  2. Maven 构建时,增加ProcessAotMojo,用来收集应用的依赖包,通过 java -cp 命令调用SolonAotProcessor
  3. SolonAotProcessor中,会先反射执行应用主类(标记@SolonMain注解),获取到应用上下文;
  4. 注册AopContext中的 BeanWrap(应用中所有的bean)、MethodWrap(方法包装)到运行时元数据中;注册所有插件(PluginEntity)到元数据中;
  5. 用户手动注册到运行时元数据,实现 RuntimeNativeRegistrar 接口;
  6. 生成GraalVM Reachability Metadata(可达性元数据),包含:native-image.properties、resource-config.json、reflect-config.json、serialization-config.json。同时还会生成Solon元数据文件 solon-resource.json,用于在 native 环境中,扫描某个 resource 目录下的资源。

注意事项

通过静态编译构建的二进制程序,虽然有内存占用小,启动速度快的优点,但也有一些局限性,比如不能在运行时获取某个类的所有方法、获取所有 resource 资源。

Solon 正尝试另外一种方式来间接实现:通过在 AOT 阶段生成的元数据文件:reflect-config.jsonsolon-resource.json,运行时读取这两个文件,reflect-config.json包含了类和字段的信息,solon-resource.json中包含了resource目录下的资源信息。

可以通过工具类ReflectUtil获取类上所有字段和方法,工具类ScanUtil扫描路径下的所有资源。

最后

Solon + GraalVM native image 无论是启动速度,还有内存占用,都让我眼前一亮,如果你不了解 Solon,可以试一试。文章来源地址https://www.toymoban.com/news/detail-426913.html

到了这里,关于我把Solon打包成了native image,速度快的惊人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个操作让数组处理速度快了5倍,到底是为什么

      概述: 通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为\\\"缓存友好\\\"(cache-friendly)或\\\"空间局部性\\\"(spatial locality) 今天做一个数组数据计算时,发现一个效率问题,给大家分享一下 一个数组排序和不排序时同样的逻辑处理速度是

    2024年03月24日
    浏览(58)
  • Kafka必须掌握的核心技术:为什么吞吐量大、速度快?

    如果不删除硬盘肯定会被撑满,所以Kakfa提供了两种策略来删除数据。一是基于时间,二是基于partition文件大小。具体配置可以参看它的配置文档。 二、Page Cache 为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存。这样做

    2024年04月08日
    浏览(52)
  • 记录--记录用前端代替后端生成zip的过程,速度快了 57 倍!!!

    业务场景: 产品有个功能是设置主题。类似手机自动切换壁纸,以及其他功能颜色,icon,字体等。 管理员需要在后端管理系统多次下载不同主题,(至于要干啥就不说了...),主题中可能有 30 ~ 100个高清壁纸, icon 等。现在每次下载主题(31张高清图片)至少需要 10s。有什么

    2024年02月08日
    浏览(44)
  • yolov8 瑞芯微 RKNN 的 C++部署,部署工程难度小、模型推理速度快

       之前写过两次yolov8目标检测部署,后续继续思考,针对部署还有优化空间,本示例的部署方式优化了部署难度,加快了模型推理速度(略微增加了后处理的时耗)。 特别说明:如有侵权告知删除,谢谢。 【完整代码】代码和模型    onnx转rknn模型这一步就不再赘述,请

    2024年01月23日
    浏览(39)
  • 何恺明团队12页论文新作剑指AIGC!“新CLIP”只需一个trick,训练速度快3.7倍!性能不降反升...

    杨净 艳艳 发自 凹非寺 量子位 | 公众号 QbitAI 何恺明团队又上新了。 这次,他们的成果围绕当下最火的AIGC背后的CLIP展开。 ——只在该模型的极简结构上,施加了一个简单的mask,就让新模型的速度快了3.7倍。 同时,性能还可以做到 不降反升 。 团队表示,希望他们的工作能

    2024年02月11日
    浏览(55)
  • yolov8n 瑞芯微RKNN和地平线Horizon芯片仿真测试部署,部署工程难度小、模型推理速度快

      特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。   模型和完整仿真测试代码,放在github上参考链接 模型和代码。   因为之前写了几篇yolov8模型部署的博文,存在两个问题:部署难度大、模型推理速度慢。该篇解

    2024年02月01日
    浏览(50)
  • yolov8n 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

      特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。   模型和完整仿真测试代码,放在github上参考链接 模型和代码。   因为之前写了几篇yolov8模型部署的博文,存在两个问题:部署难度大、模型推理速度慢。该篇解

    2024年01月16日
    浏览(64)
  • MEMORY存储引擎:MEMORY存储引擎是一个新的存储引擎,它的特点是数据全部存放在内存中,速度快,但是安全

    作者:禅与计算机程序设计艺术 MEMORY(Memory Oriented Database)存储引擎,中文名“内存式数据库”,是一种新型的存储引擎,其设计目标是能够在内存中快速访问和处理海量数据。该存储引擎是基于键值对存储的,其中值可以是任意类型的数据,包括字符串、整数、浮点数等。

    2024年02月04日
    浏览(47)
  • 我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档

    写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。觉得不错的话,欢迎小伙伴们去star一波。 很多小伙伴都不知道学习

    2024年02月04日
    浏览(53)
  • graalvm安装并使用native-image

    下载graalvm,可以直接去官网下载 https://www.graalvm.org/downloads/ github地址 https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-22.1.0 这里以jdk11为例 https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.1.0/graalvm-ce-java11-windows-amd64-22.1.0.zip native-image的jar https://github.com/graalvm/graalvm-ce-builds/r

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包