Сэкономьте 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