1 简单聊一聊spring native
!! 有没有同学有过启动java 项目需要很长时间的经历,慢时候启动项目要好几分钟,真的急死人呀,原因是因为java是要把源代码编译成class 文件的方式方式交给jvm 运行。现在我们的主角 spring native闪亮登场。很好的解决了这些问题。大家快来看看吧。:::

2 spring native 是什么
Spring Native是一个Spring Framework项目,它使用GraalVM和OpenJDK HotSpot VM的新功能,将Spring应用程序编译为本地可执行文件,以提高应用程序的启动速度和内存占用率。
Spring Native主要由以下几个组件组成:
Spring AOT(Ahead-of-Time)插件:该插件可以在构建过程中生成本地可执行文件,以提高应用程序的启动速度和内存占用率。
GraalVM:一款基于JVM的新型虚拟机,它支持将Java应用程序编译为本地可执行文件,以提高应用程序的启动速度和内存占用率。
Spring Boot:一个基于Spring Framework的快速开发框架,它可以帮助开发者快速构建Spring应用程序,并且可以与Spring Native集成,以实现本地编译和运行。
Spring Native的主要目标是提高Spring应用程序的性能和可伸缩性,并减少应用程序的启动时间和内存占用率
3 spring native 的优缺点
从上面的介绍,可以看到spring native 的优缺点是比较明显的。
优点:
-
可以把程序打包成本地可执行文件,不依赖jdk jre 等 -
提示程序的启动速度和运行速度
缺点:
-
依赖 graalvm,传统的项目难以改造
那么spring native 是否值得去使用呢,下面我们来试试,看下传统的jar 和 打包成可执行文件的差异吧。
4 环境准备
-
jdk17 以上 -
graalvm (前面文章有介绍,感兴趣的同学可以查阅)
创建一个spring native 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.11</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-native</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-native</name>
<description>spring-native</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
依赖很简单,就一个web 模块,和Maven native 的打包插件

启动正常。
先试试传统的方式打包成jar
mvn clean package

打包后的jar 差不多 18Mb
再试试spring native 的打包成可执行文件
mvn native:build
打包的速度稍慢一些

生成了一个exe 文件,大概73Mb,咋还比jar 大很多呢,这是因为它把java 的环境也打包进去了,相对于前面的 jar + jdk 还是要小很多的。如果还想小一点,可以试试自己编译jdk,把一些不需要的模块去掉,就会更小了。
5 对比
先看启动速度
相差18倍,差距很大呀
jar 包占用内存 116mb

可以看到差距还是很明显的,我是觉得值得尝试的
6 原理
那么,spring native 为什么这么快呢?
Spring Native 可以提供更快的启动速度和更低的内存占用,主要基于以下原理:
静态编译:Spring Native 使用 GraalVM 的静态编译功能,将 Spring 应用程序的 Java 字节码编译为本机代码。相比于传统的基于解释的运行时环境,静态编译可以减少启动时间和内存开销。
AOT(Ahead-of-Time)编译:GraalVM 的静态编译是一种 AOT 编译技术,即在应用程序运行之前将代码编译为本机机器码。这样可以避免了传统的 JIT(Just-in-Time)编译的启动时间和内存开销。
类路径分析:Spring Native 使用了类路径分析技术,通过分析应用程序的类路径,只编译和保留应用程序实际使用的类和方法。这样可以减少编译和生成的本机代码的大小,进一步降低了内存占用。
动态代理优化:Spring Native 对动态代理进行了优化,将动态代理转换为静态代理,减少了动态代理的运行时开销。
综上所述,Spring Native 通过静态编译、AOT 编译、类路径分析和动态代理优化等技术手段,实现了更快的启动速度和更低的内存占用。这使得应用程序可以更快地启动并占用更少的资源,适用于需要快速启动和响应的场景。
7 总结
可以看到spring native 的优势还是很明显的,我个人认为还是值得推广的,毕竟可以节省很多硬件资源和时间。spring native 比较有优势的场景有
-
微服务架构:Spring Native 可以帮助将微服务应用程序编译为本机可执行文件,从而提高启动速度和减少内存占用。这对于需要快速启动和响应的微服务非常有用。
-
云原生应用程序:Spring Native 可以帮助将 Spring 应用程序转换为本机可执行文件,从而使其更适合部署到云平台。本机可执行文件的启动速度更快,可以更好地适应云平台的弹性伸缩需求。
-
嵌入式系统:Spring Native 可以帮助将 Spring 应用程序编译为本机可执行文件,从而在资源有限的嵌入式系统上运行。本机可执行文件的内存占用更小,可以更好地适应嵌入式系统的资源限制。
喜欢我的话,可以给我点个赞呀。
原文始发于微信公众号(小羊架构):java启动慢?试试这个框架吧
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/171683.html