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>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

重温阿里云宝塔面板部署前后端项目

首先祝大家新年快乐啊&#xff01; 回到老家&#xff0c;便打算趁这一段空闲时间提升一下自己&#xff0c;重点是学习实践一下echarts相关内容&#xff0c;很多公司项目都需要实现可视化&#xff0c;所以在bilibili上找了黑马的一个教程开始学习&#xff0c;不同的是&#xff…

【JAVA WEB】 百度热榜实现 新闻页面 Chrome 调试工具

目录 百度热榜 新闻页面 Chrome 调试工具 --查看css属性 打开调试工具的方式 标签页含义 百度热榜 实现效果&#xff1a; 实现代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

生成式人工智能攻击的一年:2024

趋势科技最近公布了其关于预期最危险威胁的年度研究数据。生成人工智能的广泛可用性和质量将是网络钓鱼攻击和策略发生巨大变化的主要原因。 趋势科技宣布推出“关键可扩展性”&#xff0c;这是著名年度研究的新版本&#xff0c;该研究分析了安全形势并提出了全年将肆虐的网络…

JavaEE作业-实验二

目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 实现两个整数求和的WEB程序 2 实验要求 ①采用SpringMVC框架实现 ②数据传送到WEB界面采用JSON方式 3 思路 ①创建一个SpringMVC项目&#xff0c;配置好相关的依赖和配置文件。 ②创建一个Con…

【Jenkins】Jenkins关闭Jenkins关闭、重启

目录 一、Jenkins关闭、重启 二、Jenkins服务的启动、停止方法。 一、Jenkins关闭、重启 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit&#xff0c;关闭Jenkins服务。 例如&#xff1a;http://localhost:8081/exit 2.重启Jenkies 只有在Jenkins服务启动…

macOS Sonoma 14.3.1(23D60)发布

系统介绍 黑果魏叔2 月 9 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.3.1 更新&#xff08;内部版本号&#xff1a;23D60&#xff09;&#xff0c;本次更新距离上次发布隔了 17 天。 魏叔 查询苹果官方更新日志&#xff0c;macOS Sonoma 14.3.1 修复内容和 …

专业145+总分400+合肥工业大学833信号分析与处理综合考研经验电子信息通信,真题,大纲,参考书

今年专业课145总分400&#xff0c;我总结一下自己的专业课合肥工业大学833信号分析与处理和其他几门的复习经验。希望对大家复习有帮助。 我所用的教材是郑君里的《信号与系统》&#xff08;第三版&#xff09;和高西全、丁玉美的《数字信号处理》&#xff08;第四版&#xff…

[职场] 大厂群面的基本题型 #学习方法#其他

大厂群面的基本题型 大厂群面的基本题型 群面&#xff0c;又叫做“无领导小组面试”。历年来是企业校招时&#xff0c;进行大批量刷人的有效方法。流行于互联网、快消、银行、四大等多个行业。因为难度大、情况复杂、淘汰率高&#xff0c;又被称为“死亡面试”。 无领导小组…

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)

频率变小&#xff0c;周期变长 1&#xff0c;参考链接&#xff08;重要&#xff09; STM32CubeMX——定时器之定时功能&#xff08;学习使用timer定时器的设置&#xff09; STM32测量PWM信息&#xff08;学习使用设置pwm输入捕获&#xff09; 通用定时器中两个重要参数的设置心…

微信小程序的图片色彩分析,窃取网络图片的主色调

1、安装 Mini App Color Thief 包 包括下载包&#xff0c;简单使用都有&#xff0c;之前写了&#xff0c;这里就不写了 网址&#xff1a;微信小程序的图片色彩分析&#xff0c;窃取主色调&#xff0c;调色板-CSDN博客 2、 问题和解决方案 问题&#xff1a;由于我们的窃取图片的…

Linux下centos操作系统安装Mysql8.0过程及踩坑填补

我自己有一台服务器&#xff0c;之前安装的是MySQL5.5&#xff0c;现在我想升级为MySQL8.0&#xff0c;于是我干了以下操作,既有踩坑又有干货&#xff1a; 1.先卸载MySQL&#xff1b; 2.删除跟MySQL相关文件&#xff1b; 3.安装新的MySQL8.0版本&#xff08;这里踩了一个坑&…

【前端高频面试题--TypeScript篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 高频前端面试题--Vue3.0篇 什么是TypeScript&#xff1f;TypeScript数据类型TypeScript中命名空…

pytorch训练指标记录之tensoboard,wandb

详解Tensorboard及使用教程_tensorboard怎么用-CSDN博客文章浏览阅读5.1w次&#xff0c;点赞109次&#xff0c;收藏456次。目录一、什么是Tensorboard二、配置Tensorboard环境要求安装三、Tensorboard的使用使用各种add方法记录数据单条曲线(scalar)多条曲线(scalars)直方图(hi…

Linux运行级别 | 管理Linux服务

Linux运行级别 级别&#xff1a; 0关机1单用户2多用户但是不运行nfs网路文件系统3默认的运行级别&#xff0c;给一个黑的屏幕&#xff0c;只能敲命令4未使用5默认的运行级别&#xff0c;图形界面6重启切换运行级别&#xff1a; init x管理Linux服务 systemctl命令&#xf…

URL 统一资源定位符

1 统一资源定位符 URL 是对互联网上资源的位置和访问方法的一种简洁表示。 给资源的位置提供一种抽象的识别方法&#xff0c;并用这种方法给资源定位。 实际上就是在互联网上的资源的地址。 显然&#xff0c;互联网上的所有资源&#xff0c;都有一个唯一确定的URL。 资源&…

python+flask+django医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具…

2024刘谦春晚第二个扑克牌魔术

前言 就是刚才看春晚感觉这个很神奇&#xff0c;虽然第一个咱模仿不过来&#xff0c;第二个全国人民这么多人&#xff0c;包括全场观众都有成功&#xff0c;这肯定是不需要什么技术&#xff0c;那我觉得这个肯定就是数学了&#xff0c;于是我就胡乱分析一通。 正文 首先准备…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D &#xff0c; 任务 &#xff1a;宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel&#xff0c; 命名为PlayerInfo 新建Image&#xff0c;作为头像 新建Slider&#xff0c;作为血条 对Panel组件添加一个水…