1.概述

转载:SpringBoot新特性:节省百分之95﹪内存占用!

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

Quarkus和传统框架(SpringBoot) 对比,具有更快的启动数据、更小的内存消耗、更短的服务响应

Spring Boot 2.4 开始逐步提供对 GraalVM 的支持,旨在提升上文所述的 启动、内存、响应的使用体验

GraalVM: https://www.graalvm.org
Quarkus: https://quarkus.io

安装 GraalVM

目前官方社区版本最新为 20.3.0,是基于 OpenJDK 8u272 and 11.0.9 定制的,可以理解为 OpenJDK 的衍生版本

官方推荐的是 SDKMAN 用于快速安装和切换不同版本 JDK 的工具,类似于 nodejs 的 nvm

SDKMAN: https://sdkman.io/install
nvm: https://github.com/creationix/nvm

使用类似命令即可完成指定版本安装和指定默认版本

$ sdk install java 11.0.9.hs-adpt
$ sdk default java 11.0.9.hs-adpt

不过安装过程中需要从国外下载相关资源,笔者在尝试后使用体验并不是很好,所有建议大家下载指定版本 GraalVM 安装即可(和 JDK 安装方式一样)

安装成功查看版本:

$ java -version
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

增加相关依赖

<!-- 新增的部分,注意需要增加 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

数据对比

【java】SpringBoot新特性 节省百分之95﹪内存占用相关推荐

  1. Java 9 新特性概述

    转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...

  2. 2022年最细Java 17新特性,是真的猛,被征服了!

    SpringBoot 正式支持Java 17,Kafka3.0弃用Java8 Spring Boot 2.5.5是Spring Boot 第一个支持Java 17的版本.现在你已经可以从Spring ...

  3. Java 17新特性,快到起飞?惊呆了!

    都说Java 8 是YYDS,那你注意到 Java 17 也是长期支持版本吗?目前按计划 JDK 19 将于今年 9 月发布 SpringBoot 正式支持Java 17,Kafka3.0弃用Java ...

  4. Java 12 新特性与功能

    Java 12 新特性与功能 Java 12是Java SE的第12个版本,于2019年3月19日发布.Java 12的发布背景主要是为了帮助开发人员更加高效的进行编程工作,提高Java的性能和稳定性 ...

  5. Java 8 新特性:扩展注解(类型注解和重复注解)

    转载自  Java 8 新特性:扩展注解(类型注解和重复注解) (注:先回顾下JDK1.5版本出现的注解 ,然后再解释JDK 8的注解 更新内容.) 一.注解(JDK1.5) 1.注解(@): 注解就 ...

  6. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  7. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  8. Java 8 新特性 及 常见 面试题

    Java 8 新特性简介: 1. 代码更少(增加了新语法:Lambda 表达式) 2. 强大的 Stream API(集合数据的操作) 3. 最大化的减少空指针 异常:Optional 类 的使用 4 ...

  9. Java 16 新特性介绍

    本文要点 Java 16 和即将发布的 Java 17 引入了大量特性和语言增强,有助于提高开发人员的生产力和应用程序性能 Java 16 Stream API 为常用的终端操作提供了很多新方法,有助 ...

最新文章

  1. 10个必会的 PyCharm 技巧
  2. 第十届蓝桥杯JavaB组总结
  3. Android之layout属性介绍
  4. 空白世界地图打印版_洪恩识字卡1300字十字帖+绘本,可打印成册
  5. 7-135 二叉搜索树的2层结点统计
  6. c#中字符串截取使用的方法
  7. 网易云推出“音街”APP 入局免费K歌市场
  8. UI设计干货模板素材|数据可视化UX套件
  9. 将一个文本文件的内容按行读出,每读出一行就顺序加上行号,并写入到另一个文件中。...
  10. 大数据简历 专业技能内容
  11. WPF+VB.net制作桌面股票小助手
  12. 【延展Extension的使用场景 Objective-C语言】
  13. C语言贪心算法——找钱
  14. 收敛交叉映射(convergent cross mapping,CCM)滥觞、2012年Science论文方法部分:Detecting Causality in Complex Ecosystems
  15. java ctor_vue-test-utils设置获取TypeError:无法在字符串上创建属性'_Ctor'
  16. 编写python程序实现分段函数_python分段函数如何编写?_后端开发
  17. Java后台校验修改密码强度工具类
  18. SAP的统驭科目 - 什么是SAP的统驭科目
  19. Java入土---面向对象(OOP)
  20. 01组团队项目-Alpha冲刺-6/6

热门文章

  1. 外媒:欧盟针对谷歌语音助手展开反垄断调查
  2. 王者荣耀回应服务器崩了:已处理完成 将陆续补发相应赔偿
  3. 贝佐斯正接受14小时训练 以为周二进行的首次太空飞行做准备
  4. 特斯拉:召回不涉及国产车型 也与“刹车失灵”无关
  5. 英伟达:今年显卡将继续供不应求 尽量保证供应普通玩家
  6. 三星Galaxy S21开启预购:最早1月14日发布 售价约5300元起
  7. 4399元!苹果2020年终极新品上市就遇麻烦:付款3个月才能到货
  8. OPPO或将于本月推出Find X2 英雄联盟 S10 限定版
  9. 罗永浩直播带货二手iPhone 11:1700台秒售光!
  10. 知名笔记本躺枪!苹果首席营销官开喷:小孩用了没出息