小宇宙爆发!Spring Boot 新特性:节省95%内存占用
作者 | 冷冷
来源 | https://mp.weixin.qq.com/s/0m6ofmMlQTDUQwC7oRRIrQ
GraalVM[1] 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务。最近比较火的 Java 框架 Quarkus[2] 默认支持 GraalVM
下图为 Quarkus 和传统框架(SpringBoot) 等对比图,更快的启动数据、更小的内存消耗、更短的服务响应。
Spring Boot 2.4 开始逐步提供对 GraalVM 的支持,旨在提升上文所述的 启动、内存、响应的使用体验。
安装 GraalVM
目前官方社区版本最新为 20.3.0 ,是基于 OpenJDK 8u272 and 11.0.9 定制的,可以理解为 OpenJDK 的衍生版本 。
官方推荐的是 SDKMAN[3] 用于快速安装和切换不同版本 JDK 的工具 ,类似于 nodejs 的 nvm[4]。
使用类似命令即可完成指定版本安装和指定默认版本
sdk install java 11.0.9.hs-adpt
sdk default java 11.0.9.hs-adpt
不过安装过程中需要从国外下载相关资源 ,笔者在尝试后使用体验并不是很好,所有建议大家下载指定版本 GraalVM 安装即可(和 JDK 安装方式一样)。
安装成功查看版本
⋊> ~ java -version 11:30:34
openjdk version "11.0.9" 2020-10-20
OpenJDK Runtime Environment GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06)
OpenJDK 64-Bit Server VM GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06, mixed mode, sharing)
安装 native-image
native-image 是由 Oracle Labs 开发的一种 AOT 编译器,应用所需的 class 依赖项及 runtime 库打包编译生成一个单独可执行文件。具有高效的 startup 及较小的运行时内存开销的优势。
但 GraalVM 并未内置只是提供 gu 安装工具,需要我们单独安装。
- 切换到 jdk 的安装目录
⋊> ~ cd $JAVA_HOME/bin/- 使用gu命令安装
⋊> ./gu install native-image
初始化 Spring Boot 2.4 项目
Spring Initializr 创建 demo 项目
curl https://start.spring.io/starter.zip -d dependencies=web \-d bootVersion=2.4.1 -o graal-demo.zip
先看一下启动基准数据 , 单纯运行空项目 需要 1135 ms 秒
java -jar demo-0.0.1-SNAPSHOT.jarengine: [Apache Tomcat/9.0.41]
2020-12-18 11:48:36.856 INFO 91457 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-12-18 11:48:36.856 INFO 91457 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1135 ms
内存占用情况
ps aux | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $11 "\t" $6/1024"MB" }'
/usr/bin/java 480.965MB
支持 GraalVM
增加相关依赖,涉及插件较多完整已上传 Gitee Gist[5]
<!-- 新增的部分,注意需要增加 spring maven 仓库地址才能下载到-->
<dependency><groupId>org.springframework.experimental</groupId><artifactId>spring-graalvm-native</artifactId><version>0.8.3</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context-indexer</artifactId>
</dependency><!--需要添加 spring maven 仓库下载 spring-graalvm-native-->
<repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository>
</repositories>
Main 方法修改,proxyBeanMethods = false
@SpringBootApplication(proxyBeanMethods = false)
使用 native-image 构建可执行文件
mvn -Pnative package
#构建过程比较慢,日志如下
spring.factories files...
[com.example.demo.demoapplication:93430] classlist: 4,633.58 ms, 1.18 GB_____ _ _ __ __ _/ ___/ ____ _____ (_) ____ ____ _ / | / / ____ _ / /_ (_) _ __ ___\__ \ / __ \ / ___/ / / / __ \ / __ `/ / |/ / / __ `/ / __/ / / | | / / / _ \___/ / / /_/ / / / / / / / / / / /_/ / / /| / / /_/ / / /_ / / | |/ / / __/
/____/ / .___/ /_/ /_/ /_/ /_/ \__, / /_/ |_/ \__,_/ \__/ /_/ |___/ \___//_/ /____/...
[com.example.demo.demoapplication:93430] [total]: 202,974.38 ms, 4.23 GB
编译结果
在 targe 目录生成 名称为 com.example.demo.demoapplication
可执行文件
启动应用 这里执行的编译后的可执行文件而不是 jar
cd target./com.example.demo.demoapplication
启动时间 0.215 seconds
2020-12-18 12:30:40.625 INFO 94578 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.215 seconds (JVM running for 0.267)
看一下内存占用 24.8203MB
ps aux | grep com.example.demo.demoapplication | grep -v grep | awk '{print $11 "\t" $6/1024"MB" }'./com.example.demo.demoapplication 24.8203MB
数据对比
是否引入 GraalVM | 内存占用 | 启动时间 |
---|---|---|
否 | 480.965MB | 1135 ms |
是 | 24.8203MB | 215 ms |
参考资料
[1]GraalVM: https://www.graalvm.org
[2]Quarkus: https://quarkus.io
[3]SDKMAN: https://sdkman.io/install
[4]nvm: https://github.com/creationix/nvm
[5]Gitee Gist: https://gitee.com/gi2/codes/famcqz6n21iylpg3us7j036
喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容
点个[在看],是对小灰最大的支持!
小宇宙爆发!Spring Boot 新特性:节省95%内存占用相关推荐
- springboot内存占用大_小宇宙爆发!Spring Boot 节省95%内存占用
GraalVM[1] 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus[2] 默认支持 GraalVM 下图为 Quarkus ...
- spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身
自动分析瘦身 Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar.当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离 ...
- 【java】SpringBoot新特性 节省百分之95﹪内存占用
1.概述 转载:SpringBoot新特性:节省百分之95﹪内存占用! GraalVM是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java框架 Quark ...
- 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势
[小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...
- 【小家java】java9新特性(简述十大新特性) 褒贬不一
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- 【小家java】java10新特性(简述十大新特性) 小步迭代
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- ST小宇宙爆发,才几天又出STM32新系列!
距STM32系列新品--STM32WB官宣才过去50多天,意法半导体又带来了另一个新系列产品--STM32G0系列. 据意法半导体微控制器产品线市场经理Pierre Charvet介绍,推出STM32 ...
- 阿里云发布 Spring Boot 新脚手架,真香
作者 | 良名 阿里巴巴技术专家 背景 相信很多人都使用过 start.spring.io 来初始化自己的 Spring Boot 工程,这个工具为开发者提供了丰富的可选组件,并且可以选择多种打包方式 ...
最新文章
- python导入自定义模块和路径问题
- oracle exp cluster n,oracle cluster verfication utility failed
- python新版下载安装_各种版本的Python下载安装教程
- python绘制条形图例题_python matplotlib库绘制条形图练习题
- unitec理工学院 计算机,2020年新西兰留学Unitec理工学院计算机硕士课程全面解析...
- Centos7 连接Serial串口记录
- 防止自建控件与页面间重复引入客户端js脚本的方法
- BIM项目分享---港珠澳大桥的BIM应用与管理
- 端口错误 给Arduino下载程序提示
- 系统——现有centos7操作系统制作为iso镜像文件
- DOTA2新英霸更新日志
- kali虚拟机VMBox安装
- 记录:起个撒名了, 就叫 《方向》 吧....
- animal farm 第一章阅读笔记
- 解析解【闭式解(closed-form solution)】和数值解
- 科沃斯扫地机器人电路原理图_科沃斯扫地机器人的工作原理及维修方法
- 如何在阿里云(centos7)上面搭建fastdfs服务器(搭建篇)--保姆级超级详细
- Mysql 2003错误 10038 1045 (推荐第七次解决方案)
- 数据结构 浙江大学 2019春期末考试
- 黑马程序员--Objective-C之--自动释放池的概念以及使用