Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

这篇具有很好参考价值的文章主要介绍了Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

前言

2022-11-25,SpringBoot 3.0.0 GA版本发布,带了Web Javaer万众期待的Cloud Native特性,这也意味着占据Java Web圈半壁江山的Spring框架正式进入真正的云原生时代。笔者作为一名多年的Java Web开发者,异常激动和兴奋,因为尽管java生态圈在全球开发领域占据非常大的份额,国内各类IT企业对Java已产生了很大的依赖性,简单来说Java为我们创造了很多价值,常年沉浸于Java开发工作,也发现了Java相比其他语言的缺陷与不足,尤其是进入容器化、云原生时代,其缺点尤为明显,主要表现在启动慢、占用内用大、笨重。Spring官方也一直在改进这些问题,但在3.0之前,一直没有好的解决方案,今天我们就来在Windows平台上尝鲜体验一下Spring Boot 3.0中的native特性。
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

Native Image

Spring Boot通过GraalVM(据说Oracle会将社区版捐献到OpenJDK中)来支持native images,取代了实验性的Spring Native项目。

GraalVM 本机映像是独立的可执行文件,运行不依赖JVM,可以通过提前处理已编译的 Java 应用程序来生成。Native Image通常具有较小的内存占用,并且启动速度比 JVM 对应项更快。在Windows上可编译为本地执行运行的exe程序。

与为 JVM 编写的传统应用程序不同,GraalVM 本机映像应用程序需要提前处理才能创建可执行文件。

这里要注意,Java应用程序要支持编译为Native Image,必须有一些前提条件,主要包括

  • GraalVM 不能支持代码的动态元素,必须编译前告知反射、资源、序列化和动态代理
  • 创建Native Image时将进行程序及依赖的所有代码分析,针对无法访问的代码将被删除,并且不会成为可执行文件的一部分
  • 应用程序的classpath在生成时是固定的,不能更改
  • 没有惰性类加载,可执行文件中附带的所有内容都将在启动时加载到内存中

总之,要编译成Native Image,必须消除程序中的动态元素

SpringBoot 3.0中上述这些静态化的额外操作已基本上通过Spring Aot在编译时动态处理,开发者无需额外的配置。

具体的处理细节大家可参考SpringBoot的官方文档

GraalVM安装

请前往GraalVM官网https://www.graalvm.org/downloads/ 下载 GraalVM Community 22.3,注意当前支持的Springboot的GraalVM版本必须是22.3

笔者这里下载的Java版本为17,如下图
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验
安装GraalVM的方法与安装JAVA方法大致相同,GraalVM中包括了JDK,同时还需要安装native-image工具

注意该工具在编译时会自动检测是否存在,不存在时会自动下载,第一次下载会很慢。这里可以手动预先下载,并解压到GraalVM同目录下。

这里下载的文件为native-image-installable-svm-java17-windows-amd64-22.3.0.jar如下图所示

Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

这是笔者安装完后的文件夹结构

Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

配置环境变量PATH,JAVA_HOME

  setx /M PATH "C:\Progra~1\Java\<graalvm>\bin;%PATH%"
  setx /M JAVA_HOME "C:\Progra~1\Java\<graalvm>"

测试安装是否OK,如下图
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

Visual Studio安装

编译native image必须依赖VC++的编译环境,这里必须使用微软官方的vc++编译工具Visual Studio,笔者这里使用的最新版本2022,下面为官方描述

To use Native Image on Windows, install Visual Studio and Microsoft Visual C++ (MSVC).
There are two installation options:
    * Install the Visual Studio Build Tools with the Windows 10 SDK
    * Install Visual Studio with the Windows 10 SDK

You can use Visual Studio 2017 version 15.9 or later.

The `native-image` builder will only work when it is run from the **x64 Native Tools Command Prompt**.
The command for initiating an x64 Native Tools command prompt varies according to whether you only have the Visual Studio Build Tools installed or if you have the full Visual Studio 2019 installed.

从上可知,Visual Studio 2017 version 15.9 or later均可。

打开Visual Studio Installer,勾选如下图中三个组件

Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

安装完成后,需要配置VC++的编译环境变量PATH,INCLUDE,LIB

看相关文章也可不配置,但是执行编译时必须在X64 Native Tools Command Prompt for VS 2022控制台中执行,但笔者安装的环境下编译失败,提示找到 stdio.h 等错误,如果网友也遇到同样,欢迎提供更好的解决方案

LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\ucrt\x64;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\lib\x64

INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\shared;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\include

PATH=D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64

SpringBoot示例编写

可使用https://start.spring.io/来生成项目模板,完整的项目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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring_native_test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <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>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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>

编写一个简单的spring mvc应用

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created on ${DATE}.
 *
 * @author ${USER}
 */
@RestController
@SpringBootApplication
public class MyApplication {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

配置项目,注意这里必须选择GraalVM作为项目的SDK
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验
调试运行,正常启动
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

native编译

在项目根目录下执行

mvn -Pnative native:compile

下图为最终执行成功的输出

Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验
在项目target目录下可以找到spring_native_test.exe文件

运行对比

native image运行控制台输出如下图
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验
jvm运行控制台输出如下图
Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验

jar(JVM) 本地exe(native image)
文件大小 18M 69M
启动耗时 1.209s 0.098s
内存占用 106M 46m

根据上述对比结果,尽管是一个最简单的springboot程序,但在启动耗时上native具有明显的优势,达到毫秒级,占用内存少了一半多。

由于是一项新技术,其推广和普及肯定需要一段时间,但在一些新的小型应用中,完全可以试试手,毕竟尽量native用不了,还有jvm可以兜底,我们并需要为此做额外的工作。

最后,希望java web能通过native的特性,真正的适配云原生。文章来源地址https://www.toymoban.com/news/detail-406456.html

到了这里,关于Spring Boot 3.0 GA来啦,GraalVM Native Image Support初体验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Spring boot 3.0新特性详解

    Spring Boot 3.0 在 2021 年 9 月发布,该版本带来许多令人兴奋的新特性。本文将详细介绍 Spring Boot 3.0 的主要新特性。 Spring Boot 3.0 要求 JDK 11 或更高版本。并且官方建议使用 Java 16,可以充分利用其新特性。 Spring Boot 3.0 首次官方支持 WebFlux - Spring 的反应式框架。我们可以很容易地开

    2024年02月05日
    浏览(48)
  • spring boot 2.7 -> 3.0升级指南

    spring boot提供一个版本迁移指南 2.7 - 3.0

    2024年02月09日
    浏览(38)
  • Spring Boot 3.0 新书出炉(文末送书)

    大家好,我是哪吒。 很多小伙伴反馈: 空有一腔热血,每天学习20个小时,坚持了两个月,还停在Java基础,感觉什么都会了,又感觉什么都不会,迷迷糊糊; 每天都想着要好好学习SpringBoot,两个月过去了,还没开始; 三天打鱼,两天晒网,哎,一地鸡毛; … SpringBoot知识

    2024年02月04日
    浏览(62)
  • 终于把 Spring Boot 3.0 写成书了!

    大家好,我是R哥。 我的新书《 Spring Boot 3 核心技术与最佳实战 》打磨一年多,今天终于上市了,定价 158 元,今天刚上市搞 5 折促销 ,80 元不到上车,这可能是全网最便宜的时候了,机会难得,想拥抱 Spring Boot 3.0 的不要错过。 文章还没发,已经有老铁粉丝上车了,真爱啊

    2023年04月19日
    浏览(30)
  • spring boot 2.7.9 整合 Swagger 3.0

     jdk  1.8 springboot 2.7.9 swagger 3.0.0 描述:Failed to start bean \\\'documentationPluginsBootstrapper\\\'; nested exception is java.lang.NullPointerException 没有这个bean,空指针了。 据网上资料找,3.0的Swagger已经不继承WebMvcConfig这个类,是继承了WebMvcConfigSupport类,从而改动了配置路径规则,然后报空指针,

    2024年02月06日
    浏览(65)
  • Spring Boot 3.0系列【23】应用篇之集成Spring WebFlux

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.4 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 官方文档地址 Spring MVC 是 Spring 专门为 Servlet API 和 Servlet 容器而设计的 Web 框架, 在 5.0 版本中加入了基于响应式的 Web 框架 Spring WebFlux ,它是完全 非阻

    2023年04月14日
    浏览(31)
  • 【SpringBoot3】Spring Boot 3.0 集成 Redis 缓存

    Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于作为数据库、缓存和消息中间件,以快速读写和丰富的数据结构支持而著称。 在应用程序和数据库之间,Redis缓存作为一个中间层起着关键

    2024年02月21日
    浏览(40)
  • 【SpringBoot3】Spring Boot 3.0 介绍以及新特性

    Spring Boot 3.0 是 Spring Boot 框架的一个重要版本,它在保持了 Spring Boot 的一贯优点的同时,也进行了一些重要的改进和更新。 首先,Spring Boot 3.0 对 Java 版本的要求进行了更新。这个版本要求使用 Java 17 作为最低版本,以利用最新的语言特性和性能改进。如果你正在使用的是

    2024年01月17日
    浏览(42)
  • Spring Boot 3.0系列【25】数据篇之Spring Cache缓存技术使用详解

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.5 源码地址:https://gitee.com/pearl-organization/study-spring-boot3

    2023年04月14日
    浏览(30)
  • Spring boot maven 插件 build image

    首先项目本身要在 spring boot 2.5 以上,并且导入spring-boot-mavne 插件 如果网络没有问题的话,可以把如下xml删除 构建并且发布 定义完pom.xml之后可能会出现的问题 首先本身需要安装docker win https://docs.docker.com/desktop/install/windows-install/ linux 阿里云镜像加速 因为spring-boot-maven-plugin本身

    2024年02月08日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包