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 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

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

到此这篇关于Spring Boot 2.4新特性减少95%内存占用问题的文章就介绍到这了,更多相关Spring Boot 2.4新特性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

赞 (0)

相关推荐

  • Springboot升级至2.4.0中出现的跨域问题分析及修改方案

    问题 Springboot升级至2.4.0中出现的跨域问题. 在Springboot 2.4.0版本之前使用的是2.3.5.RELEASE,对应的Spring版本为5.2.10.RELEASE. 升级至2.4.0后,对应的Spring版本为5.3.1. Springboot2.3.5.RELEASE时,我们可以使用CorsFilter设置跨域. 分析 版本2.3.5.RELEASE 设置跨域 设置代码如下: @Configuration public class ResourcesConfig

  • Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响(推荐)

    前几天在<Spring Boot 2.4 对多环境配置的支持更改>一文中,给大家讲解了Spring Boot 2.4版本对多环境配置的配置变化.除此之外,还有一些其他配置变化,所以今天我们就继续讲讲其他的更新内容! spring.profiles.include对于这个配置项,你是否熟悉呢?从字面意思也不难理解,应该就是用来引入一些其他配置的配置(因为有个include嘛),实际作用也确实如此! 当我们的应用有很多配置信息的时候,比如当用到了很多中间件MySQL.Redis.MQ等,每个中间件

  • Spring Boot 2.4 对多环境配置的支持更改示例代码

    在目前最新的Spring Boot 2.4版本中,对配置的加载机制做了较大的调整.相关的问题最近也被问的比较多,所以今天就花点时间,给大家讲讲Spring Boot 2.4的多环境配置较之前版本有哪些变化. 多环境配置 2.4版本之前 先回顾下,2.4版本之前,我们在yaml配置文件中,使用spring.profiles来定义不同环境的标识,比如下面这样: spring: profiles: "dev" name: dev.didispace.com --- spring: profi

  • Spring Boot 2.4 新特性之一键构建Docker镜像的过程详解

    背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中. spotify .fabric8 这里主要使用的主要是如下两种插件 spotify .fabric8 , - -配置通过 xml 定义出 Dockerfile 或者挂载外部 Dockerfile 通过调用

  • 浅谈SpringBoot2.4 配置文件加载机制大变化

    前言 Spring Boot 2.4.0.M2刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别.但是如果您的应用程序使用更复杂的配置(例如,Spring Cloud 配置中心等),则需要来了解更改的内容以及原因. 为什么要进行这些更改 随着最新版本 Spring Boot 发布,S

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

    节省 95%的内存占用,减少 80%的启动耗时. GraalVM 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus 默认支持 GraalVM 下图为 Quarkus 和传统框架(SpringBoot) 等对比图,更快的启动速度.更小的内存消耗.更短的服务响应. Spring Boot 2.4 开始逐步提供对 GraalVM 的支持,旨在提升上文所述的 启动.内存.响应的使用体验. 安装 GraalVM 目前官方社区版本最新为

  • Spring Boot2.6.0新特性之默认禁止循环引用

    目录 前言 处理方案一: 处理方案二: 处理方案三: 总结 前言 如下代码,ComponentA类注入ComponentB类,ComponentB类注入ComponentA类,就会发生循环依赖的问题,在2.6.0之前,spring会自动处理循环依赖的问题 import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class ComponentA { @Resou

  • Spring Boot 2.0 设置网站默认首页的实现代码

    Spring Boot设置默认首页,方法实验OK如下 附上Application启动代码 /** * @ClassName Application * @Description Spring-Boot website启动类 * @author kevin.tian * @Date 2018-03 * @version 1.0.0 */ @SpringBootApplication @PropertySource(value={ "file:${APP_HOME_CONF}/overpayment

  • 通过Spring Boot + Mybatis + Redis快速搭建现代化Web项目

    背景 SpringBoot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybatis是一个十分轻量好用的ORM框架.Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果. 本篇博客将介绍如何使用SpringBoot快速搭建一个Web应用,并且采用Mybatis作为我们的ORM框架.为了提升性能,我们将Redis作为Mybatis的二级缓存.为了测试我们的代码,我们编写了单元测试,并且用H2内存数据库

  • 使用IntelliJ IDEA 2017.2.5 x64中的Spring Initializr插件快速创建Spring Boot/Cloud工程(图解)

    在我的上一篇文章中,选用了http://start.spring.io/创建工程. 接下来使用IntelliJ IDEA 2017.2.5 x64创建Spring Boot/Cloud工程 新安装的IntelliJ IDEA 2017.2.5 x64中没有Spring Initializr这个插件; 接下来安装Spring Initializr插件; 在settings -> Plugins 里面搜索spring boot,勾选上,然后再重启下idea,就可以了.如果Plugins里面没有spr

  • static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类(推荐)

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习. 前言 各位小伙伴大家好,我是A哥.上篇文章了解了static关键字 + @Bean方法的使用,知晓了它能够提升Bean的优先级,在@Bean方法前标注static关键字,特定情况下可以避免一些烦人的"警告"日志的输出,排除隐患让工程变得更加安全.我们知道static关键字它不仅可使用在

  • 利用Spring Boot创建docker image的完整步骤

    前言 在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个docker file,将这个fat jar制作成为一个docker image然后运行. 今天我们来体验一下Spring Boot 2.3.3 带来的快速创建docker image的功能. 传统做法和它的缺点 现在我们创建一个非常简单的Spring Boot程序: @SpringBootApplication @Res

  • spring5新特性全面介绍

    前方:对于很多开发人员来说,目前大都还在使用spring4的时候,而spring5早已经发布.虽然你可能暂时还没有使用到spring5,但还是需要对其有个大概的了解. Spring 5 于 2017 年 9 月发布了通用版本 (GA),它标志着自 2013 年 12 月以来第一个主要 Spring Framework 版本.它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式宣言中陈述的反应式原则为基础. 这个版本是很长时间以来最令人兴奋的 Spring Framework 版本

  • Spring Boot示例分析讲解自动化装配机制核心注解

    目录 1. 自动化装配介绍 2. Spring Boot 自动化配置UML图解 3. Spring Boot 自动化配置核心注解分析 3.1 @Inherited 3.2 @SpringBootConfiguration 3.3 @EnableAutoConfiguration 3.4 @ComponentScan 3.5 @ConfigurationPropertiesScan 3.6 @AutoConfigurationImportSelector 3.7 @AutoConfiguratio

随机推荐