Spring Boot 2.4新特性之GraalVM

Spring Boot 2.4新特性

(节省 95%的内存占用,减少 80%的启动耗时)

第一步.安装 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.jar

engine: [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

最后数据对比

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值