Spring Boot 2.4新特性减少95%内存占用问题

网友投稿 340 2023-02-12

Spring Boot 2.4新特性减少95%内存占用问题

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

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

下图为 Quarkus 和传统框架(SpringBoot) 等对比图,更快的启动速度、更小的内存消耗、更短的服务响应。

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

安装 GraalVM

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

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

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

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 Shttp://erver 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 及较小的运行时内存http://开销的优势。

但 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

org.springframework.experimental

spring-graalvm-native

0.8.3

org.springframework

spring-context-indexer

spring-milestones

Spring Milestones

https://repo.spring.io/milestone

&lhttp://t;/repository>

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.exhttp://ample.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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Cloud 2020.0.0正式发布再见了Netflix
下一篇:SpringBoot内存数据导出成Excel的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~