springnative让java应用脱离jvm
传统的 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相关推荐
- java lisp,摸索JVM上的LISP[Java编程]
赞助商链接 本文"摸索JVM上的LISP[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其 ...
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记
前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
- 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能查 ...
- Java虚拟机(JVM)
Java虚拟机(JVM)是能够让计算机运行Java程序的虚拟且可以计算运作的机器.JVM有三个概念:规范文档.实现和实例.规范文档是规范地说明Java虚拟机必须有哪些实现的文档.单一的规范文档保证了所 ...
- java中对JVM的深度解析、调优工具、垃圾回收
jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...
- Java编译器、JVM、解释器
Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译 ...
- Java 详解 JVM 工作原理和流程
2019独角兽企业重金招聘Python工程师标准>>> 作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java ...
- 利用 Java dump 进行 JVM 故障诊断
引言 对于大型 java 应用程序来说,再精细的测试都难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...
最新文章
- gatsby_将您的GraphCMS数据导入Gatsby
- 使用nginx后如何在web应用中获取用户ip及原理解释
- java实现文件名过滤器接口_Java使用文件过滤器FileFilter、FilenameFilter搜索文件
- 认识Linux设备驱动模型和Kobject
- 绘制方法太单一!?这三个宝藏在线学习资源推荐给你~~
- Ehab and Path-etic MEXs CodeForces - 1325C(思维+贪心)
- 类的特殊成员反射异常处理
- 关于ASP.NET 中的主题
- 蓝桥杯第八届省赛JAVA真题----迷宫
- java.lang.ClassCastException:android.widget.Button cannot be cast to android.widget.ImageView
- shell 数组详解
- 在css中translate表示,css中位移translate()如何使用?translate用法总结
- linux卸载致远oa,致远oa(seeyon)文件上传漏洞重现及分析
- 红米note3双网通丨标注:2015617_官方线刷包_救砖包_解账户锁
- 微信公众号平搜索排名,如何让公众号搜索排名靠前,公众号文章关键词排名规则
- C语言相关的经典书籍(附Ebook)
- MySQL 5.7 安装教程(全步骤、保姆级教程)
- 深度残差网络(ResNet)浅析
- 云服务器增加虚拟内存
- “着色器”是什么意思? 如何使用HTML5和WebGL创建它们
热门文章
- u8系统服务器已停止怎么办,紧急通知!用友U8报错:enterpriseportal 已停止工作的解决办法!...
- c# DataTable关联dataGridView创建与修改数据
- 图片转excel的网站
- Unity3D使用LitJson.dll解析报错问题
- STM32擦写失败case
- 元宇宙:从数字孪生到数字共生
- 清华开课《摸鱼学导论》,1000多学子在线摸鱼
- 使用rrdtool统计网站PV和IP
- 【报名】RT-Thread师资培训,苏州大学王宜怀教授主讲!
- 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!