【Spring云原生】Spring官宣,干掉原生JVM,推出 Spring Native!整体提升性能!Native镜像技术在Spring中的应用

news2024/9/29 21:34:33

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

 

Spring 团队发布了 Spring Native Beta 版。通过 Spring Native,Spring 应用将有机会与 GraalVM 原生镜像的方式运行。为了更好地支持原生运行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了优化原生配置的注解。

Spring 发布了 Spring Native 的 beta 版本,并在http://start.spring.io上运行它。

实际上,这意味着自Spring成立以来,除了Spring支持的常规Java虚拟机之外,我们还将添加Beta支持,以使用GraalVM将Spring应用程序编译到本机映像中,从而提供一种部署Spring应用程序的新方法。支持Java和Kotlin。

这些本机Spring应用程序可以部署为独立的可执行文件(无需安装JVM),并提供有趣的特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低的内存消耗,但所需的构建时间和运行时优化次数少于JVM。

目录

原理

应用:

Spring Native的优势包括:

使用Spring Native

生成Native镜像:完成上述配置后,您可以使用以下命令生成Spring应用程序的Native镜像:

生成的Native镜像将位于target目录下。通过将Spring应用程序编译为Native镜像,可以提高应用程序的性能

优化

直接在编译时定义了MyClass类,避免了在运行时使用反射机制来加载类。

部署和交付优化

部署示例:

使用Docker进行部署示例代码:

使用Buildah进行部署示例代码:

与传统JVM调优的比较


  1. 引言
    Spring Native作为Spring框架的扩展,利用Native镜像技术实现了对Spring应用程序的编译优化,从而提升应用性能和启动速度。本文将介绍Spring Native的背景和动机,以及Native镜像技术的概念和原理。

  2. 原理

Native镜像技术是一种将Java应用程序编译成本地可执行文件的技术。它的原理是通过静态编译将整个Java应用程序及其依赖项转换为本地机器代码,从而实现更快的启动时间和较小的内存占用。

Spring Native的主要目标是通过将Spring应用程序编译为本地镜像,提供更快的启动时间、更低的内存消耗和更好的资源利用率。通过消除JVM启动和解释阶段的开销,Spring Native可以显著减少应用程序的启动时间,并减少内存占用。

应用:

Spring Native的优势包括:

  1. 更快的启动时间:通过将应用程序编译为本地镜像,减少了JVM启动和解释的时间,从而实现更快的应用程序启动。

  2. 较低的内存消耗:本地镜像消除了传统Java应用程序所需的JVM内存开销,减少了内存占用,提高了资源利用率。

  3. 更好的资源利用率:由于减少了内存消耗,Spring Native可以在有限的资源环境中更有效地运行,提供更好的可伸缩性和性能。

使用Spring Native

使用Spring Native扩展需要以下步骤:

  1. 安装GraalVM:首先,您需要安装GraalVM。您可以从GraalVM官方网站(https://www.graalvm.org)下载适合您操作系统的GraalVM发行版,并按照官方文档进行安装。

  2. 配置GraalVM:安装完成后,您需要将GraalVM设置为默认的JDK。您可以使用以下命令将GraalVM设置为默认JDK:

$ gu install native-image
$ export PATH=$PATH:/path/to/graalvm/bin

添加Spring Native依赖:在您的Spring项目中,您需要添加Spring Native的依赖。在您的项目的pom.xml文件中,添加以下依赖:

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

配置Spring Native:您需要配置Spring Native插件以指定要编译为Native镜像的类和功能。您可以在您的项目的pom.xml文件中添加以下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-aot-maven-plugin</artifactId>
            <version>0.10.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

生成Native镜像:完成上述配置后,您可以使用以下命令生成Spring应用程序的Native镜像:

$ mvn spring-aot:generate
$ mvn package -Pnative

生成的Native镜像将位于target目录下。通过将Spring应用程序编译为Native镜像,可以提高应用程序的性能

优化

  • 讨论替换动态特性和反射机制的方法
     

静态配置示例:在传统的使用Spring框架的应用程序中,通常使用XML配置文件或注解来配置Bean。这种静态配置的方式可以避免使用反射机制来实现动态的Bean实例化。

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl(); // 明确地实例化Bean
    }
}

在上述示例中,通过在配置类中明确地实例化Bean,避免了使用反射机制。

明确的Bean实例化方式示例:在某些场景下,可以使用明确的实例化方式来代替反射机制。

public class MyFactory {
    public static MyService createMyService() {
        return new MyServiceImpl(); // 明确地实例化Bean
    }
}

在上述示例中,通过使用静态工厂方法来明确地实例化Bean,避免了使用反射机制。

替代动态特性的示例代码如下:

  1. 静态代理示例:静态代理是一种替代动态代理的方式,可以在编译时生成代理类,避免在运行时使用反射机制。
    public interface MyService {
        void doSomething();
    }
    
    public class MyServiceImpl implements MyService {
        @Override
        public void doSomething() {
            // 实现具体的业务逻辑
        }
    }
    
    public class MyServiceProxy implements MyService {
        private MyService target;
    
        public MyServiceProxy(MyService target) {
            this.target = target;
        }
    
        @Override
        public void doSomething() {
            // 在调用目标对象之前或之后,可以添加额外的逻辑
            // ...
            target.doSomething();
            // 在调用目标对象之前或之后,可以添加额外的逻辑
            // ...
        }
    }

  2. 编译时生成代码示例:在某些场景下,可以使用编译时生成代码的方式来替代动态加载类。
    public class MyClass {
        public void doSomething() {
            // 实现具体的业务逻辑
        }
    }

    直接在编译时定义了MyClass类,避免了在运行时使用反射机制来加载类。

部署和交付优化

  • Native镜像的部署可以直接使用常见的构建工具包括Docker和Buildah。
  • 使用构建好的Native镜像,可以在目标环境中进行部署和运行。这可以通过使用容器管理平台(如Docker Swarm或Kubernetes)来实现,也可以直接在本地或云环境中运行。

部署示例:

使用Docker进行部署示例代码:

# Dockerfile
FROM scratch
COPY my_app /my_app
CMD ["/my_app"]

上述示例已经有一个名为 my_app 的本地机器代码可执行文件。在构建镜像时,将可执行文件复制到镜像中并设置其作为容器的默认命令。

构建Docker镜像的命令如下(假设 Dockerfile 和可执行文件在同一目录下):

docker build -t my_app_image .

 运行Docker容器的命令如下:

docker run -d my_app_image

这将在后台运行名为 my_app_image 的容器,并执行 my_app 可执行文件。

使用Buildah进行部署示例代码:

# 构建本地镜像
buildah bud -t my_app_image .

# 创建容器
container=$(buildah from my_app_image)

# 将可执行文件复制到容器中
buildah copy $container my_app /my_app

# 设置容器的默认命令
buildah config --cmd ["/my_app"] $container

# 保存容器为镜像
buildah commit $container my_app_image

# 运行镜像
podman run -d my_app_image

与传统JVM调优的比较

  1. 编译方式:传统JVM调优主要关注在运行时对JVM进行优化,包括调整垃圾回收器、调整堆内存大小、调整线程池参数等。而Spring Native则采用了提前编译的方式,将应用程序及其依赖项编译为本地机器代码,以提高性能和启动时间。

  2. 依赖项处理:在传统JVM调优中,依赖项通常以JAR文件的形式打包,并在运行时通过类加载器进行动态加载。而Spring Native会对依赖项进行静态分析和静态链接,将它们与应用程序一起编译为本地机器代码,减少了依赖项的加载和解析时间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++的队列的用法

基本介绍 c的队列就是std::queue。 需要包含的头文件&#xff1a; #include<queue>queue就是先进先出队列 queue,就是队列&#xff0c;队列是一种容器适配器&#xff0c;专门设计用于在FIFO上下文中操作(先进先出)&#xff0c;其中将元素插入容器的一端并从另一端提…

LangChain 教程:构建 LLM 支持的应用程序的指南

作者&#xff1a;Aditya Tripathi GPT-4 和 LLaMA 等大型语言模型 (LLM) 在过去几年中创造了一个充满可能性的世界。 它预示着人工智能工具和应用程序的繁荣&#xff0c;ChatGPT 似乎一夜之间成为家喻户晓的名字。 但如果没有为促进新一代应用程序而创建的强大工具和框架&#…

【面试题】webpack的五大核心、构建流程、性能优化

【面试题】webpack的五大核心、webpack的构建流程、webpack的性能优化 webpack是什么?webpack的五大核心webpack的构建流程webpack性能优化 webpack是什么? js静态模块打包工具。 功能 将多个文件打包成更小的文件&#xff0c;(压缩)翻译 babal-loader es6进行降级兼容。 …

【pyinstaller打包记录】Linux系统打包可执行文件后,onnxruntime报警告(Init provider bridge failed)

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…

如何根据企业司法涉诉大数据合理规避风险?

在当前的商业环境中&#xff0c;企业司法涉诉的信息越来越成为衡量一家企业信誉和运营风险的重要标准。大数据时代的到来&#xff0c;让我们有了更加丰富的手段对这些信息进行挖掘与分析&#xff0c;从而对企业可能面临的风险进行预警。本文将探讨如何通过对企业司法涉诉的大数…

服务器硬件监控,保障系统稳健运行的关键策略

服务器硬件在运维中扮演着至关重要的角色&#xff0c;超过一半的网络中断是由硬件故障引起的&#xff0c;这使得硬件性能监控成为运维中不可或缺的一部分。对于一个组织或企业的信息技术基础设施而言&#xff0c;重要性不言而喻&#xff1a; 1. 安全性&#xff1a;服务器硬…

虚拟内存地址动静态库

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第5篇,在这里分享给大家,还有一些书籍《[深入理解计算机系统》《计算机组成&#xff1a;结构化方法》《计算机体系结构&#xff1a;量化研究方法》《程序员的自我修养》&#xff0c;今天我们来了解程序的虚拟…

聚观早报 | 2024款腾势D9将发布;岚图汽车2月销量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月2日消息 2024款腾势D9将发布 岚图汽车2月销量 苹果Vision Pro防汗新专利 真我12 Pro正式开售 Redmi K70/Pro…

wvp-gb28181-pro国标设备录像下载

点击【国标设备】&#xff0c;进入设备通道 每个通道右边都有对应的操作&#xff0c; 点击操作栏中的【设备录像】按钮 点击【设备录像】进入录像查看页面&#xff0c;选择要查看的日期即可对录像进行播放和下载 播放&#xff1a;双击录像名称 下载&#xff1a;点击下载按钮 下…

SpringBoot实现分页模糊查询

1. Navicat查询数据 Navicat中查询所有数据 SELECT * FROM sys_user;Navicat中查询前两条数据&#xff08;俩种方式&#xff09; SELECT * FROM sys_user LIMIT 2; //从0开始&#xff0c;第一个参数是起始位置即(pageNum-1)*pageSize&#xff0c;第二个参数是步长 SELECT * …

一文搞定Pytorch CUDA Toolkit与Driver的关系

1. 在我们使用Pytorch不同的版本时&#xff0c;有这样一个大致的对应关系&#xff0c;即&#xff1a;Pytorch版本CUDA Toolkit版本NVIDIA Driver 版本。 难点在于CUDA版本与Driver版本的关系&#xff0c;简单通过NVIDIA官网解决&#xff1a;CUDA Compatibility 这里既有关于Li…

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Golang 程序启动原理详解

一.编译 go源代码首先要通过 go build 编译为可执行文件,然后去机器上直接执行的&#xff0c;在 linux 平台上为 ELF 格式的可执行文件&#xff0c;linux 能直接执行这个文件,而编译阶段会经过编译器、汇编器、链接器三个过程最终生成可执行文件 编译器&#xff1a;*.go 源码通…

基于“xxx” Androidx平台的驱动及系统开发 之 触摸板篇

目录 一、基于全志 A133 Android10平台&#xff0c;适配1366x768 - ilitek2511触摸1、原理图分析2、驱动移植与适配3、补丁和资源文件 二、基于瑞芯微 RK3566 Android11平台&#xff0c;适配GT9XX触摸1、原理图分析2、补丁及资源文件 三、遇到的问题与解决1、基于amlogic Andro…

【Leetcode】1588.所有奇数长度子数组的和

题目描述 思路 题目要求我们求解所有奇数长度数组的和。若暴力循环求解&#xff0c;时间复杂度过高。所以&#xff0c;我们可以采用前缀和优化。 如上图输入arr数组&#xff0c;sum[i]用于计算arr数组中前i个数的和。(在程序中&#xff0c;先给sum[0]赋值&#xff0c;等于arr[0…

python.模块与包

1.模块是什么 本质上是一种python文件&#xff0c;以.py结尾&#xff0c;里面有类&#xff0c;函数&#xff0c;变量等&#xff0c;认为这是一个工具包&#xff0c;每个模块有不同的功能&#xff0c;导入后可以直接使用 2.模块的导入 方法1 import 模块名 使用&#xff1a…

LLM 模型量化推理速度评测

最近了解了下些常见的推理和加速方案&#xff1a; 1、量化方案&#xff1a; gptq、quantization、int8、int4、AWQ、Speculative Decoding、GGUF 2、Attention加速方案&#xff1a; atten的不同种类fused attention 3、内存层面&#xff1a; kv_cache策略、page_attention…

洛谷 P1083 [NOIP2012 提高组] 借教室(二分+差分)

题目链接&#xff1a; P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 在大学期间&#xff0c;经常需要租借教室。大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。教室的大小功能不同&#xff0c;借教…

YOLO系列中的“data.yaml”详解!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、data.yaml介绍 YOLO系列中的data.yaml文件包含了YOLO系列模型运行所需要的数据集路径、数据集中的类别数及标签。数据集路径可以用绝对路径也可以…

计算机系统缺少cv100.dll文件解决方法(最新)

cv100.dll 是一个Windows操作系统中的动态链接库&#xff08;DLL&#xff09;文件。DLL文件是包含可由多个程序共享的代码和数据的模块&#xff0c;以减少磁盘空间占用并提高系统性能。根据收集到的信息&#xff0c;cv100.dll 文件可能与图像处理、计算机视觉相关的功能有关。 …