«Новые функции Spring Boot 2.4» снижают использование памяти на 95%

Spring Boot Java

Сэкономьте 95 % использования памяти и 80 % времени запуска.


GraalVM[1]Это высокоэффективная виртуальная производительность машины и эффективность работы, она может значительно улучшить программу, идеально подходящую для микросервисов. Недавнее сравнение Fire Java FrameworkQuarkus[2]GraalVM поддерживается по умолчанию

На следующем рисунке показано сравнение Quarkus и традиционной среды (SpringBoot).Более быстрый запуск, меньшее потребление памяти, более короткий ответ службы.

Spring Boot 2.4 начал постепенно предоставлять поддержку GraalVM,Разработано для улучшения процесса запуска, памяти и скорости отклика, описанных выше..

Установить GraalVM

  • В настоящее время официальная версия сообщества составляет 20,3.0, что настроен на основе OpenJDK 8U272 и 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 — это компилятор AOT, разработанный Oracle Labs.Зависимости классов и библиотеки времени выполнения, необходимые приложению, упакованы и скомпилированы для создания единого исполняемого файла.Преимущества эффективного запуска и небольших затрат памяти во время выполнения.

Но GraalVM не является встроенным, а предоставляет только инструмент установки gu, который требует от нас установки его отдельно.

- 切换到 jdk 的安装目录
⋊> ~ cd $JAVA_HOME/bin/

- 使用gu命令安装
⋊>  ./gu install native-image

Инициализировать проект Spring Boot 2.4

  • Spring Initializr создает демонстрационный проект
curl https://start.spring.io/starter.zip -d dependencies=web \
           -d bootVersion=2.4.1 -o graal-demo.zip
  • Давайте посмотрим на начало справочных данных, и простой проект Air Runtime нуждается в 1135 мс секунд.
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)

  • Создайте исполняемый файл с собственным изображением
 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
  • скомпилировать результат

Генерируется в целевом каталоге с именемcom.example.demo.demoapplicationзапускаемый файл

  • запустить приложениеСкомпилированный исполняемый файл выполняется здесь вместо jar
cd target

./com.example.demo.demoapplication
  • Время запуска 0,215 секунды
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,8203 МБ
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