java启动慢?试试这个框架吧

1 简单聊一聊spring native

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

java启动慢?试试这个框架吧

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 的优缺点是比较明显的。

优点:

  1. 可以把程序打包成本地可执行文件,不依赖jdk jre 等
  2. 提示程序的启动速度和运行速度

缺点:

  1. 依赖 graalvm,传统的项目难以改造

那么spring native 是否值得去使用呢,下面我们来试试,看下传统的jar 和 打包成可执行文件的差异吧。

4 环境准备

  1. jdk17 以上
  2. 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 的打包插件

java启动慢?试试这个框架吧

启动正常。

先试试传统的方式打包成jar

mvn clean package
java启动慢?试试这个框架吧

打包后的jar 差不多 18Mb

再试试spring native 的打包成可执行文件

mvn native:build

打包的速度稍慢一些

java启动慢?试试这个框架吧

生成了一个exe 文件,大概73Mb,咋还比jar 大很多呢,这是因为它把java 的环境也打包进去了,相对于前面的 jar + jdk 还是要小很多的。如果还想小一点,可以试试自己编译jdk,把一些不需要的模块去掉,就会更小了。

5 对比

先看启动速度

传统jar 1.8sjava启动慢?试试这个框架吧

可执行文件 不到 0.1sjava启动慢?试试这个框架吧

相差18倍,差距很大呀

jar 包占用内存 116mb

java启动慢?试试这个框架吧

可执行文件占用内存 36Mbjava启动慢?试试这个框架吧差不多3倍左右

可以看到差距还是很明显的,我是觉得值得尝试的

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 比较有优势的场景有

  1. 微服务架构:Spring Native 可以帮助将微服务应用程序编译为本机可执行文件,从而提高启动速度和减少内存占用。这对于需要快速启动和响应的微服务非常有用。

  2. 云原生应用程序:Spring Native 可以帮助将 Spring 应用程序转换为本机可执行文件,从而使其更适合部署到云平台。本机可执行文件的启动速度更快,可以更好地适应云平台的弹性伸缩需求。

  3. 嵌入式系统:Spring Native 可以帮助将 Spring 应用程序编译为本机可执行文件,从而在资源有限的嵌入式系统上运行。本机可执行文件的内存占用更小,可以更好地适应嵌入式系统的资源限制。

喜欢我的话,可以给我点个赞呀。


原文始发于微信公众号(小羊架构):java启动慢?试试这个框架吧

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/171683.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!