作者 | 冷冷

来源 | 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%内存占用相关推荐

  1. springboot内存占用大_小宇宙爆发!Spring Boot 节省95%内存占用

    GraalVM[1] 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus[2] 默认支持 GraalVM 下图为 Quarkus ...

  2. spring boot jar包_「Spring Boot 新特性」 jar 大小自动瘦身

    自动分析瘦身 Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar.当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离 ...

  3. 【java】SpringBoot新特性 节省百分之95﹪内存占用

    1.概述 转载:SpringBoot新特性:节省百分之95﹪内存占用! GraalVM是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java框架 Quark ...

  4. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

  5. 【小家java】java9新特性(简述十大新特性) 褒贬不一

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  6. 【小家java】java10新特性(简述十大新特性) 小步迭代

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  7. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  8. ST小宇宙爆发,才几天又出STM32新系列!

    距STM32系列新品--STM32WB官宣才过去50多天,意法半导体又带来了另一个新系列产品--STM32G0系列. 据意法半导体微控制器产品线市场经理Pierre Charvet介绍,推出STM32 ...

  9. 阿里云发布 Spring Boot 新脚手架,真香

    作者 | 良名 阿里巴巴技术专家 背景 相信很多人都使用过 start.spring.io 来初始化自己的 Spring Boot 工程,这个工具为开发者提供了丰富的可选组件,并且可以选择多种打包方式 ...

最新文章

  1. python导入自定义模块和路径问题
  2. oracle exp cluster n,oracle cluster verfication utility failed
  3. python新版下载安装_各种版本的Python下载安装教程
  4. python绘制条形图例题_python matplotlib库绘制条形图练习题
  5. unitec理工学院 计算机,2020年新西兰留学Unitec理工学院计算机硕士课程全面解析...
  6. Centos7 连接Serial串口记录
  7. 防止自建控件与页面间重复引入客户端js脚本的方法
  8. BIM项目分享---港珠澳大桥的BIM应用与管理
  9. 端口错误 给Arduino下载程序提示
  10. 系统——现有centos7操作系统制作为iso镜像文件
  11. DOTA2新英霸更新日志
  12. kali虚拟机VMBox安装
  13. 记录:起个撒名了, 就叫 《方向》 吧....
  14. animal farm 第一章阅读笔记
  15. 解析解【闭式解(closed-form solution)】和数值解
  16. 科沃斯扫地机器人电路原理图_科沃斯扫地机器人的工作原理及维修方法
  17. 如何在阿里云(centos7)上面搭建fastdfs服务器(搭建篇)--保姆级超级详细
  18. Mysql 2003错误 10038 1045 (推荐第七次解决方案)
  19. 数据结构 浙江大学 2019春期末考试
  20. 黑马程序员--Objective-C之--自动释放池的概念以及使用

热门文章

  1. 优雅的操作scrapy爬虫的开始和结束
  2. 高频Fiddler软件测试面试题
  3. PYTHON 计算PSNR
  4. Lync UI suppression 设置
  5. Android 使用数学函数(Math函数)
  6. 验证程序加载失败,请检查您的浏览器设置,例如广告拦截程序
  7. Windows如何查看某个端口被占用的情况?
  8. net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx
  9. 不让ppt2007自动调整文本
  10. 3秒帮你用大数据搞定微信公众号运营!