Spring Native 解放 JVM

一、Spring Native 是什么

Spring Native可以通过GraalVMSpring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用。与Java虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常适合容器和Kubernetes。使用原生镜像有明显优势,如快速启动,提高峰值性能以及降低内存消耗。Spring Native支持JavaKotlin

这个项目的目标是寻找Spring JVM的替代方案,提供一个能将应用程序打包,并运行在轻量级容器的方案。期望能够在Spring Native中支持所有的Spring应用程序(几乎不用修改代码)。

原生(本地)镜像是一种将Java代码构建为独立可执行文件的技术。该可执行文件包括应用程序类、其依赖项的类、运行时库类以及来自JDK的静态链接本地代码。JVM被打包到原生镜像中,因此在目标系统上不需要任何Java运行环境,但构建产物依赖于平台。因此,需要为每个支持的目标系统进行一次构建,在使用Docker等容器技术时会更加简单,将容器构建为一个目标系统,可以部署到任何Docker运行时。

二、优点

Spring Native的基础是GraalVM,而GraalVM是使用Java静态编译,将Java字节码编译为汇编代码,即二进制native程序,他摒弃了JVM,这是成就它所有优点的根本原因。
【1】编译出来的原生Spring应用可以作为一个独立的可执行文件进行部署(不需要安装JVM
【2】几乎瞬时的启动(一般小于100毫秒)
【3】瞬时的峰值性能
【4】更低的资源消耗

三、局限性

GraalVM项目也有一些缺点和权衡,希望随着时间的推移有所改进:
【1】构建本地映像是一个繁重的过程,比JVM更长的构建时间;
【2】相比于传统的Java运行方式,运行时优化不足;
【3】不能直接支持反射、动态代理等动态特性;
【4】现在处于实验阶段,生态比较少;

四、原生镜像(native image)和常规 JVM 程序的区别

【1】在构建时会从主入口点对应用程序进行静态分析。
【2】在构建时会移除未使用的代码。
【3】需要配置反射、动态代理等。
【4】类路径ClassPath在构建时就已经确定。
【5】没有类延迟加载:可执行文件中所有的内容都会在启动时加载到内存中。
【6】在构建时就运行了一些代码。
【7】构建原生镜像还存在一些局限性。
【8】一些Java切面类的特性未得到完全支持。

五、前置条件:GraalVM

通用递归应用和算法语言虚拟机Graal VM是一个高性能的JDK发行版,专为Java和其他JVM语言编写,同时支持JavaScriptRubyPython和其他几种语言。GraalVM的多语言能力使得在一个应用程序中混合使用多种编程语言成为可能,同时消除了不同语言间互相调用的成本。它提供了一个原生镜像生成器Native Image builder,这是一个从Java应用中生成原生代码并将其与VM一起打包成独立可执行文件的工具。Spring Boot MavenGradle Plugin除了少数 例外情况(Mockito目前不支持原生测试),正式支持该工具。

Ahead-Of-Time(AOT)编译是将高级Java代码编译成本地可执行代码的过程。通常由JVM的即时编译器JIT在运行时进行编译,这样可以在执行应用程序时进行观察和优化。在AOT编译的情况下,这一优势就不复存在了。

通常,在进行AOT(Ahead-of-Time)编译之前,可以选择进行一个单独的步骤,称为AOT处理,即从代码中收集元数据并提供给AOT编译器。将这两个步骤分开是有意义的,因为AOT处理可以是针对特定框架的,而AOT编译器更加通用。下面的图片给出了一个概览:

Java平台的另一个特点是,只需将JAR放入类路径,就能在目标系统上进行扩展。通过启动时的反射和注解扫描,就能在应用中获得扩展行为。不幸的是,这会减慢启动时间,而且不会带来任何好处,尤其是对于云原生应用,因为在云原生应用中,服务器运行时和Java基类都打包到了JAR中。因此,可以放弃这一功能,然后可以使用闭环优化Closed World Optimization来构建应用。

详细信息参考:JIT即时编译与AOT提前编译; GraalVM :官网

六、Spring Native 基础环境搭建

【1】必须安装Docker 可以参考 Windows10 Docker Desktop安装 ,同时注意要能够以非root用户启动和运行。可以通过使用docker run hello-world (不包含sudo)命令检查Docker daemon是否可用。
【2】快速创建一个SpringBoot项目
【3】添加Spring Native依赖: 必须在项目中手动加入和配置。对于AOT处理,有一个单独的MavenGradle插件,它并没有合并到Spring Boot插件中。org.springframework.experimental:spring-native提供了native配置的API,例如@NativeHint这些Spring运行成native image的注解类。

<dependency>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-native</artifactId>
    <version>0.9.1</version>
</dependency>

【4】添加Spring AOT插件: Spring AOT插件执行代码的提前转换,有助于改善原生镜像的占用空间和修复native image的兼容性。

<plugin>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-aot-maven-plugin</artifactId>
    <version>0.9.1</version>
    <executions>
        <execution>
            <id>test-generate</id>
            <goals>
                <goal>test-generate</goal>
            </goals>
        </execution>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【5】开启native image支持: Spring BootSpring Boot Buildpacks support可以将Spring Boot应用程序打包成一个容器。native image buildpack可以通过BP_NATIVE_IMAGE环境变量开启。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <builder>paketobuildpacks/builder:tiny</builder>
            <env>
                <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
            </env>
        </image>
    </configuration>
</plugin>

【6】构建本地应用程序: 通过此命令,可以创建一个使用GraalVM native image compiler构建的Linux容器,默认情况下,这个镜像是在本地。

mvn spring-boot:build-image

【7】原生镜像构建:Profile将在打包阶段调用构建中的native-image编译器。通过在Maven package命令中提供native Profile,就可以构建原生镜像了:mvn clean package -Pnative

<profiles>
    <profile>
        <id>native</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.graalvm.buildtools</groupId>
                    <artifactId>native-maven-plugin</artifactId>
                    <version>0.9.17</version>
                    <executions>
                        <execution>
                            <id>build-native</id>
                            <goals>
                                <goal>build</goal>
                            </goals>
                            <phase>package</phase>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、西瓜书——绪论

第一章 绪论 1.独立同分布 通常 假设 样本空间 中 全 体样 本 服 从 一 个 未 知 “ 分 布 ” ( d i s t r i b u t i o n ) D , 我们获得的每个样本都是独立地从这个分布上采样获得的&#xff0c; 即 “ 独 立同 分布 ” ( i n d e p e n d e n t a n d i d e n t ic a …

配置VMware实现从服务器到虚拟机的一键启动脚本

正文共&#xff1a;1666 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 首先祝大家新年快乐&#xff01;略备薄礼&#xff0c;18000个红包封面来讨个开年好彩头&#xff01; 虽然之前将服务器放到了公网&#xff08;成本增加了100块&#xff0c;内网服务器上公网解决方案…

二叉树和堆(优先队列)

前言&#xff1a; 本章会讲解二叉树及其一些相关练习题&#xff0c;和堆是什么。 二叉树&#xff1a; 二叉树的一些概念&#xff1a; 一棵二叉树是有限节点的集合&#xff0c;该集合可能为空。二叉树的特点是每一个节点最多有两个子树&#xff0c;即二叉树不存在度大于2的节点…

红包封面的流量是真的大啊

你好&#xff0c;我是小生&#xff0c;一个程序员转型做自媒体副业中~ 昨天&#xff0c;是农历 2023 年最后一天&#xff0c;到下午饭后的时候&#xff0c;红包封面流量推上了高峰期&#xff0c;非常的狂暴&#xff0c;有要烟花封面的、有要金龙封面的、有要表白封面的等等。 小…

在计算机/移动设备上恢复已删除视频的 10 个数据恢复工具

视频在网上疯传&#xff0c;我们都观看或创建视频&#xff0c;并将我们最喜欢的视频保存在硬盘上。如果我们丢失了一些重要的视频&#xff0c;那将是非常令人心碎的。但是今天&#xff0c;恢复已删除的视频变得更加容易。删除的视频在被新数据覆盖之前并没有真正从您的存储驱动…

单片机在物联网中的应用

单片机&#xff0c;这个小巧的电子设备&#xff0c;可能听起来有点技术性&#xff0c;但它实际上是物联网世界中的一个超级英雄。简单来说&#xff0c;单片机就像是各种智能设备的大脑&#xff0c;它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…

Web前端-移动web开发_rem布局

文章目录 移动web开发之rem布局1.0 rem基础1.1 rem单位(重点)1.2 em单位(了解)1.3 媒体查询什么是媒体查询媒体查询语法规范 1.4 less 基础维护css弊端Less 介绍Less安装Less 使用之变量使用node编译less的指令Less 编译 vocode Less 插件Less 嵌套Less 运算Less中的Mixin混入L…

使用 MinIO 超级充电 TileDB 引擎

MinIO 是一个强大的主要 TileDB 后端&#xff0c;因为两者都是为性能和规模而构建的。MinIO 是一个单一的 Go 二进制文件&#xff0c;可以在许多不同类型的云和本地环境中启动。它非常轻量级&#xff0c;但也具有复制和加密等功能&#xff0c;并且提供与各种应用程序的集成。Mi…

这MySQL错误日志异常也太猛了吧

作者&#xff1a;田逸&#xff08;formyz&#xff09; 一台核心业务数据库&#xff0c;版本为MySQL 8.34 社区服务器版。从上线以来&#xff0c;这个数据库服务器的错误日志增增加非常迅猛&#xff08;如下图所示&#xff09;&#xff0c;每24小时能增加到10多个G的容量。 因为…

前后端分离nodejs+vue动态网站的图书借阅管理系统35ih5

读者模块 1)注册&#xff1a;读者输入账号、密码、确认密码、姓名、手机、身份证、邮箱&#xff0c;点击注册按钮&#xff0c;完成注册。 2)登录&#xff1a;普通读者成功输入读者账号和密码&#xff0c;点击登录按钮。 3)读者主页面&#xff1a;读者登录成功后&#xff0c;选择…

C++重新入门-循环

目录 1.循环类型 while循环&#xff1a; for循环 基于范围的for循环(C11) do...while 循环 2.循环控制语句 3.无限循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着…

使用Flash download tool进行ESP32固件烧录

背景 为方便分发固件&#xff0c;可在任意电脑上安装烧录软件&#xff0c;直接将固件烧录进 烧录内容 查看vscode上platformio的烧录过程 Writing at 0x00000000... (100 %) Wrote 15104 bytes (10401 compressed) at 0x00000000 in 0.4 seconds (effective 281.3 kbit/s).…

【Spring源码分析】Spring的启动流程源码解析

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入&#xff08;一&#xff09;【Spring源码分析】…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

openresty (nginx)快速开始

文章目录 一、什么是openresty&#xff1f;二、openresty编译安装1. 编译安装命令1.1 编译完成后路径1.2 常用编译选项解释 2. nginx配置文件配置2.1 nginx.conf模板 3. nginx常见配置一个站点配置多个域名nginx配置中location匹配规则 三、OpenResty工作原理OpenResty工作原理…

实现自定义标记

实现自定义标记 问题陈述 New Tech Book的高级管理层决定在其用JSP设计的应用程序的所有页面上显示版权信息。它们还要去如何向应用程序中添加JSP页面,可以重用显示版本信息的代码。公司的软件开发人员Jerry Smith决定用自定义标记来创建应用程序的这一部分。 解决方案 要解…

【数学建模】【2024年】【第40届】【MCM/ICM】【D题 五大湖的水位控制问题】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem D: Great Lakes Water Problem Background The Great Lakes of the United States and Canada are the largest group of freshwater lakes in the world. The five lakes and connecting waterways const…

社区团购系统-UMLChina建模知识竞赛第5赛季第6轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

sqli-labs-master靶场训练笔记(54-65|决战紫禁之巓)

2024.2.5 level-54 1、先判断类型和闭合类型 ?id1/0 #正常 证明不是数字型 ?id1 #错误 ?id1 -- a #正常 判断是 闭合 2、 判断列数 这里需要运气&#xff0c;但是根据前面50多关的经验直接猜测是3列 ?id-1 union select 1,2,3 -- a 3、爆表名&#xf…