传统的 Spring 应用程序都是必须依赖于 Java 虚拟机(JVM)运行的,Spring Native 的诞生就是无需 JVM,它提供了另外一种运行和部署 Spring 应用的方式(目前只支持 Java 和 Kotlin),通过 GraalVM 将 Spring 应用程序编译成原生镜像。

# Spring Native 特点
1、无需 JVM 环境, Spring Native 应用程序可以作为一个可执行文件独立部署;
2、应用即时启动,一般情况下应用启动时间 < 100ms;
3、即时的峰值性能;
4、更少的内存消耗;

# Spring Native 缺点
Spring Native 应用启动那么快也是有代价的,和 JVM 应用相比:

1、构建更笨重、构建时间更长;
2、更少的运行时优化;
3、很多 Java 功能受限;
4、很多特性还很不成熟;

# Spring Native 应用场景
1、Spring Cloud 无服务器化(Serverless);
2、以更廉价持久的方式运行 Spring 微服务;
3、非常适合 Kubernetes 平台,如:VMware Tanzu;
4、为 Spring 应用创建更佳的容器镜像;

#Spring Native 和 JVM 的区别
1、Spring Native 构建时会进行应用程序静态分析;
2、Spring Native 构建时会移除未被使用的组件;
3、Spring Native 反射、资源、动态代理需要配置化;
4、Spring Native 构建时的 classpath 是固定不变的;
5、Spring Native 没有类延迟加载,可执行文件包含所有内容都在启动时加载到内存;
6、Spring Native 构建时会运行一些代码;
7、Spring Native 对于 Java 应用程序还存在一些局限性;

#GraalVM 简介
Spring Native 的核心就是 Oracle 的黑科技:GraalVM。

GraalVM 是一个由 Oracle 开发的全栈通用虚拟机,拥有高性能、跨语言交互等逆天特性,不仅支持了 Java、Scala、Groovy、Kotlin 等基于 JVM 的语言,以及 C、C++ 等基于 LLVM 的语言,还支持其他像 JavaScript、Ruby、Python 和 R 语言等,可提高多种语言的运行速度和吞吐量。

首先用命令行试试

到https://github.com/graalvm/graalvm-ce-builds/releases

下载 graalvm 来代替jdk

我下载的是

https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.0.0.2/graalvm-ce-java8-linux-amd64-21.0.0.2.tar.gz

解压缩配置环境变量

export GRAALVM_HOME=/home/qzc/program/graalvm-ce-java8-21.0.0.2export JAVA_HOME=$GRAALVM_HOME
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=.:$JAVA_HOME/bin:$PATH:$MAVEN_HOME/bin:$GRAALVM_HOME/bin

然后手动下载 https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.0.0.2/native-image-installable-svm-java8-linux-amd64-21.0.0.2.jar

将native这个jar放到graalvm的bin目录下离线安装

gu -L install native-image-installable-svm-java8-linux-amd64-21.0.0.2.jar

然后就可以用native-image命令了

编译java文件 javac HelloWorld.java

将class文件编译为可执行文件 native-image HelloWorld

就可以直接执行HelloWorld 了,不需要jvm了

试过稍微复杂的springboot工程,native-image -jar ./target/spring-boot-native-1.0.jar

会出现不能找到main函数入口

还是继续用maven插件自动编译成docker镜像吧

到https://start.spring.io/创建工程,依赖加入

Spring Native 和 Spring Web

生成工程后,手动创建一个 web服务文件

@RestController
public class WebmvcController {@GetMapping("/")public String foo() {return "Hello GraalVm from native-image: /hello/name";}@GetMapping("/hello/{name}")public String foo(@PathVariable String name) {return "Hello " + name;}
}

在ide里springboot应用可以运行,打包jar也正常

mvn package -DskipTests 跳过单元测试,但是会继续编译
mvn package -Dmaven.test.skip=true 不执行测试用例,也不编译测试用例类。

不构建镜像,这个时候可以直接用jar了

java -jar ./target/demo-0.1.jar

构建docker镜像耗时比较长

./mvnw spring-boot:build-image

每次构建都要从https://github.com下载graalvm 和 native,造成docker里缓存很多失败文件,几次下来硬盘可能就塞满了,所以必要时清理docker缓存

docker system prune -a -f?
docker system df 清完之后看一下

如果成功构建,可以用命令

docker run --rm -p 8080:8080 demo:0.1

或docker-compose.yml文件启动

version: '3'
services:demonative:image: demo:0.1container_name: demonativerestart: alwaysports:- 8080:8080

启动命令 :

docker-compose up -d

停止

docker-compose down

大概率构建会失败,因为下载graalvm300多m可能会失败,即便成功,再下载native这个几M点jar也会失败,这个现在还是beta版,将来正式推广有国内镜像的话也许就不至于这么费事了,最好是下载过一次。能够配置一下复用不需要每次下载才有意义。

springnative让java应用脱离jvm相关推荐

  1. java lisp,摸索JVM上的LISP[Java编程]

    赞助商链接 本文"摸索JVM上的LISP[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其 ...

  2. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记

    前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...

  3. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  4. Error:could not open'C:\Porogram Files\Java\jrelib\j386\jvm.cfg'

    Error:could not open'C:\Porogram Files\Java\jrelib\j386\jvm.cfg'之解决方法 不知道什么原因,反正重装完后javac -version能查 ...

  5. Java虚拟机(JVM)

    Java虚拟机(JVM)是能够让计算机运行Java程序的虚拟且可以计算运作的机器.JVM有三个概念:规范文档.实现和实例.规范文档是规范地说明Java虚拟机必须有哪些实现的文档.单一的规范文档保证了所 ...

  6. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  7. Java编译器、JVM、解释器

    Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译 ...

  8. Java 详解 JVM 工作原理和流程

    2019独角兽企业重金招聘Python工程师标准>>> 作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java ...

  9. 利用 Java dump 进行 JVM 故障诊断

    引言 对于大型 java 应用程序来说,再精细的测试都难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

最新文章

  1. gatsby_将您的GraphCMS数据导入Gatsby
  2. 使用nginx后如何在web应用中获取用户ip及原理解释
  3. java实现文件名过滤器接口_Java使用文件过滤器FileFilter、FilenameFilter搜索文件
  4. 认识Linux设备驱动模型和Kobject
  5. 绘制方法太单一!?这三个宝藏在线学习资源推荐给你~~
  6. Ehab and Path-etic MEXs CodeForces - 1325C(思维+贪心)
  7. 类的特殊成员反射异常处理
  8. 关于ASP.NET 中的主题
  9. 蓝桥杯第八届省赛JAVA真题----迷宫
  10. java.lang.ClassCastException:android.widget.Button cannot be cast to android.widget.ImageView
  11. shell 数组详解
  12. 在css中translate表示,css中位移translate()如何使用?translate用法总结
  13. linux卸载致远oa,致远oa(seeyon)文件上传漏洞重现及分析
  14. 红米note3双网通丨标注:2015617_官方线刷包_救砖包_解账户锁
  15. 微信公众号平搜索排名,如何让公众号搜索排名靠前,公众号文章关键词排名规则
  16. C语言相关的经典书籍(附Ebook)
  17. MySQL 5.7 安装教程(全步骤、保姆级教程)
  18. 深度残差网络(ResNet)浅析
  19. 云服务器增加虚拟内存
  20. “着色器”是什么意思? 如何使用HTML5和WebGL创建它们

热门文章

  1. u8系统服务器已停止怎么办,紧急通知!用友U8报错:enterpriseportal 已停止工作的解决办法!...
  2. c# DataTable关联dataGridView创建与修改数据
  3. 图片转excel的网站
  4. Unity3D使用LitJson.dll解析报错问题
  5. STM32擦写失败case
  6. 元宇宙:从数字孪生到数字共生
  7. 清华开课《摸鱼学导论》,1000多学子在线摸鱼
  8. 使用rrdtool统计网站PV和IP
  9. 【报名】RT-Thread师资培训,苏州大学王宜怀教授主讲!
  10. 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!