Spring Native 解放 JVM

时间:2024-02-11 23:27:56 标签:  spring  

一、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>
来源:分享自作者个人站点/博客

智能推荐

一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像&#xff0c;提供了一种新的方式来部署Spri

标签:spring  

学习目标 解决以下问题: 1.什么是 React Native &#xff1f;为什么它的名字中有 “Native” 字样&#xff1f; 2.为什么 React Native 如此之酷&#xff1f; 3.我们可以分别使

标签:React  

参考文档&#xff1a;SpringData JPA&#xff1a;一文带你搞懂 - 知乎 (zhihu.com) 一、 前言 1.1 概述 Java持久化技术是Java开发中的重要组成部分&#xff0c;它主要用于将对象数据持久化到数据库中&#xff0c;以及从数据库中查询和恢复对象数据。在Java持久化技术领域&#xff0c;Java Persistence API (JPA) 和 Spring Data JPA 是两个非常流行的框架。本文将对这两个框架进行简

标签:入门  

项目中使用 Spring Security 做身份认证和授权&#xff0c;使用 Knife4j 做接口调试。两者集成的时候出现了一些问题。比如&#xff1a;页面拒绝访问、访问页面空白、控制台报4

标签:静态  

老孟导读:这是老孟翻译的付费文章,文章所有权归原作者所有。欢迎加入老孟Flutter交流群,每周翻译2-3篇付费文章,精彩不容错过。原文地址:https://medium.com/swlh/flutter-vs-react-native-vs-native-deep-performance-comparison-990b90c11433

标签:深度  性能  Flutter  React  native  

解读方法区 什么是方法区&#xff1f; 说的简单点就是Java内存结构中的一块内存区域&#xff0c;用来存放一些东西&#xff0c;存放什么呢&#xff1f;主要就是存放已经被虚拟机加载的类型信息&#xff0c;常量以及一些静态变量等信息&#xff0c;另外对于方法区&#xff0c;还存储着非常重要的一类东西&#xff0c;叫做“常量池”。 比如大家听说的类常量池&#xff0c;也即是Class常量池&#xff0c;然后还有字符串常量池以及运行时常量池&#xff01; 然后再往上层去理解方法区的话&#xff0c;它则是《JVM规范》所定义的&#xff0

标签:详解  

摘要:本篇图文将介绍追踪区域的内存类型以及 NMT 无法追踪的内存。本文分享自华为云社区《【技术剖析】17. Native Memory Tracking 详解(3)追踪区域分析(二)》,作者:毕昇小助手。CompilerCompiler 就是 JIT 编译器线程在编译 code 时本身所使用的内存。查看 NMT 详情:[

标签:详解  区域分析  memory  native  Tracking  

引言 React Native 是一种跨平台的移动应用开发框架&#xff0c;由 Facebook 推出。它可以让我们使用 JavaScript 和 React 语法编写原生应用&#xff0c;大大提高了移动应用的开发效率。但是&#xff0c;对于开发人员来说&

标签:详解  

摘要:在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择。本文希望向大家介绍AndroidView的使用方式以及在此基础之上拓展的双端嵌入Native组件的解决方案。引言在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择。本文希望向大家介绍AndroidView的使用方式以及在此基础之上拓展的双端嵌入Native组件的解决方案。1. 使用教程1.1. DemoR

标签:组件  解决方案  Flutter  native  

React Native 的基础是React, 是在 web 端非常流行的开源 UI 框架。要想掌握 React Native,先了解 React 框架本身是非常有帮助的。一、什么是React Native1.1 React Native带来的惊喜React&nbsp;Native 是一个使用JavaScript 和 React 来编写跨终端移动应用(Android 或

标签:学习笔记  环境  简介  React  native  

JVM概述 基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;即 Java 虚拟机&#xff0c;一种规范&#xff0c;本身是一个虚拟计算机&#xff0c;直接和操作系统进行交互&#xff

标签:JVM  

目录 什么是JVM JVM 的功能 常见的JVM

标签:JVM  

什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一

标签:JVM  

Hermes 是专门针对 React Native 应用而优化的全新开源 JavaScript 引擎。对于很多应用来说&#xff0c;启用 Hermes 引擎可以优化启动时间&#xff0c;减少内存占用以及空间占用。从 React Native 0.70

标签:反编译  

第一次运行到安卓失败 Could not find implementation class &#39;com.facebook.react.ReactRootProjectPlugin&#39; for plugin &#39;com.facebook.react.rootproject&#39; specified in jar:file:/D:/Android_Studio_Data/.gradle/caches/jars-9/o_3a1fd35320f05989063e7069031b710f/react-native-gradle-plugin.jar!/META-INF/gradle-plugins/com.fa

标签:错误  

3.基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。4 3.1.创建工程

标签:见解  

目录 1.AOP概述  2.AOP相关术语

标签:详解  

JVM 基础 - 类字节码详解 多语言编译为字节码在JVM运行Java字节码文件Class文件的结构属性从一个例子开始反编译字节码文件字节码文

标签:字节  

目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈

标签:详解  

趋于当前技术不断更新、产品功能多元化之下,流量回放的热度也是越来越高。在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater我个人就先尝试一下,期间还是遇到一些问题,通过咨询和度娘的帮助下,整体功能的使用流程是跑通了。jvm-sandbox-repeater简介在聊之前,我们先来了解下jvm-sandbox-repeater,其实在官网上也有详细的介绍,这里就直接搬官网的吧jvm-sandbox-repeater是JVM-Sandbox生态体系下的重要模块,它具备了JVM-Sandbox的所有特点,插件式设计便

标签:流量  工具  入门篇  JVM  repeater  

Spring事务控制 事务介绍 什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&

标签:见解  

JVM简介 JVM全称为Java Virtual Machine&#xff0c;翻译过来就是java虚拟机&#xff0c;Java程序&#xff08;Java二进制字节码&#xff09;的运行环境 JVM的优点&#xff1a; Java最大的一个优点是&#xff0c;一次编写&#xff0c;到处运行。之所以能够实现这个功能就是依靠JVM&#xff0c;这是因为JVM屏蔽字节码与操作系统之间的差异&#xff0c;对外提供了一致的运行环境。

标签:简介  

JVM简介 JVM全称为Java Virtual Machine&#xff0c;翻译过来就是java虚拟机&#xff0c;Java程序&#xff08;Java二进制字节码&#xff09;的运行环境 JVM的优点&#xff1a; Java最大的一个优点是&#xff0c;一次编写&#xff0c;到处运行。之所以能够实现这个功能就是依靠JVM&#xff0c;这是因为JVM屏蔽字节码与操作系统之间的差异&#xff0c;对外提供了一致的运行环境。

标签:简介  

内存区域程序计数器、虚拟机栈、本地方法栈这三个是线程私有的;堆、方法区是线程公有的;程序计数器:记录线程走到字节码的哪一行;虚拟机栈:由栈帧组成,每个栈帧包含局部变量表、操作数栈、动态链接、方法返回地址,当执行到一个方法的时候,就会把这个方法以栈帧形式压入栈本地方法栈:与虚拟机栈差不多,只不过这个栈是给本地方法用的堆:堆的垃圾回收算法常用的是分代回收法,所以堆被划分出新生代,老年代;方法区: 1.7之前方

标签:JVM  

1. JVM体系结构JVM体系结构

标签:JVM  

猜你喜欢

嗨&#xff0c;亲爱的读者朋友们&#xff01;欢迎来到这篇

标签:注解  

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、K

标签:系列  

基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。 1.创建工程

标签:注解  

文章目录 1. 定义2. 好处3. 示例代码4. 组件命名总结 在 Spring 框架中&#xff

标签:注解  

一、编写并注册原生常量方法 在 SmallDaysAppModule 这个模块中有一个方法 getConstans &#xff0c;重载这个方法就可将自定义的常量返回&#xff0c;系统会自行调用该方法并返回定义的常量将其直接注入到 JS 层&#xff0c;在

标签:常量  

1.背景&nbsp;随着对用户体验要求的提高,产品要求提升用户体验,多端体验一致。随着多端相同的业务也越来越多,需要投入IOS,Android,Web多端开发人员。这

标签:实战  平台  React  native  Web  

摘要 本文将介绍在React Native开发中常见的性能优化问题和解决方案&#xff0c;包括ScrollView内无法滑动、热更新导致的文件引用问题、高度获取、强制横屏UI适配、低版本RN适配iOS14、缓存清理、navigation参数取值等。通过代码案例

标签:性能  

学习React native开发中&#xff0c;自定义了一个组件&#xff0c;传参进来了一个数组tabList 想读取数组值的时候&#xff0c;tabList.map(item &#61;> item.component)一直报Cannot read property &#39;map&#39; of undefined 后来发现&#xff0c;是无法直接识别tabList是个数组&#xff0c;需要先判断 可通过方法1&#xff1a;{(tabList || []).map(e &#61;> e.component)}&#xff0c;或一个空数组来表示是个数组 方法2&#xff1a;{tabList

标签:read  

【汇总】解决Spring-Web与Spring-WebFlux冲突 问题发现问题解决问题一&#xff1a;The bean &#39;requestMappingHandlerMapping&#3

标签:冲突  

目录 一、JVM概述         一、JVM作用

标签:JVM  

四、本地方法接口         一、概念         二、使用原因

标签:JVM  

    ​ &#x1f34e;个人博客&#xff1a;个人主页

标签:软弱  

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、K

标签:字节  

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;锁是多线程编程的关键部分&#xff0c;用于保护共享资源&#xff0c;防止并发访问导致的数据不一致性。锁的性能和效率在高并发场景下至关重要。当多个线程竞争同一资源时&#xff0c;锁的状态可能会经历多次升级&#xff0c;以优化性能和减少开销。本文将详细探讨JVM锁的膨胀升级过程。 1. 偏向锁&#xff08;Biased Locking&#xff09; 偏向锁是为了解决只有一个线程访问共享资源的场景。在这种情况下&#xff0c;为了避免每次都需要争夺锁&#xff0c;JVM会偏向于第一个访问共享资源的线程&#xff0c;并为其分配偏向锁。 1.1 启用偏向锁

标签:详解  

1. JVM 概述 JVM&#xff1a;Java Virtual Machine&#xff0c;也就是 Java 虚拟机

标签:字节  

一、简介 JVM会加载类到内存中&#xff0c;所以 JVM 中必然会有一块内存区域来存放我们写的那些类。Java中有类对象、普通对象、本地变量、方法信息等等各种对象信息&#xff0c;所以JVM会对内存区域进行划分&#xff1a; JDK1.8及以后&#xff0c;上图中的方法区变成了Metaspace——元数据区。 我们本章的目

标签:模型  

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&#xff0c;挖的越深&#xff0c;基础越扎实&#xff01; 阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析阶段5、深

标签:实战  

1.写在前面前面已经分享了很多关于jvm的知识,具体的详情都可以查看上几篇的文章。从jvm的调优原理,垃圾查找算法,垃圾回收算法,再到jvm调优工具,调优参数等。需要掌握的jvm知识,已经是循序渐进,一步一步的深入学习。那在掌握这些内容的时候,是不是有种想去实践的冲动呢?好了,今天我们就来进行一次jvm调优实践之旅吧!!!主要从以下几个方面进行展开描述:JVM实践调优主要步骤分析GC日志堆内存与元空间优化线程堆栈优化堆内存内部优化:新生代和老年代比例垃

标签:JVM  调优  

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的

标签:注解  

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。

标签:注解  

Filter的用法public interface Filter { //初始化方法,整个生命周期中只执行一次。 //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。 //参数FilterConfig用于获取初始化参数 public void init(FilterConfig filterConfig) throws ServletException; //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法 //才能将请求交经下一个Filter或Servlet执行

标签:深度  spring  Filter  

介绍Spring AOP的实现逻辑在AnnotationAwareAspectJAutoProxyCreator类,AOP的核心在于Bean对象初始化过程中如何查找关联的advice并通过创建动态代理。针对每个Bean在初始化过程中会遍历spring的context上下文查找所有的aop的切面对象,并针对切面对象的每个方法生成一个advisor对象用以匹配每个目标方法。关于动态代理包括JdkDynamicAopProxy和ObjenesisCglibAopProxy,后者依赖于cglib的enhancer用法。AnnotationAwareAspectJAut

标签:深度  spring  Aspect  

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl

标签:容器  

一.安装java环境  java 8之前的版本是不支持react native的,必须使用java 8&nbsp;二.安装android studio  (1)环境变量配置:

标签:环境  React  native  

文章目录 1 注解&#64;EventListener1.1 示例Demo1.1.1 简单例子1.1.2 解耦1.1.3 Spring事件

标签:注解  

相关问题

相关文章

热门文章

推荐文章

相关标签