節省 95%的內存佔用,減小 80%的啓動耗時。java
GraalVM 是一種高性能的虛擬機,它能夠顯著的提升程序的性能和運行效率,很是適合微服務。最近比較火的 Java 框架 Quarkus 默認支持 GraalVMnode
下圖爲 Quarkus 和傳統框架(SpringBoot) 等對比圖,更快的啓動速度、更小的內存消耗、更短的服務響應。git
Spring Boot 2.4 開始逐步提供對 GraalVM 的支持,旨在提高上文所述的 啓動、內存、響應的使用體驗。github
目前官方社區版本最新爲 20.3.0 ,是基於 OpenJDK 8u272 and 11.0.9 定製的,能夠理解爲 OpenJDK 的衍生版本
。
web
官方推薦的是 SDKMAN 用於快速安裝和切換不一樣版本 JDK 的工具 ,相似於 nodejs 的 nvm。spring
使用相似命令便可完成指定版本安裝和指定默認版本shell
sdk install java 11.0.9.hs-adpt
sdk default java 11.0.9.hs-adpt
不過安裝過程當中須要從國外下載相關資源 ,筆者在嘗試後使用體驗並非很好,全部建議你們下載指定版本 GraalVM 安裝便可(和 JDK 安裝方式同樣)。app
⋊> ~ 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 是由 Oracle Labs 開發的一種 AOT 編譯器,應用所需的 class 依賴項及 runtime 庫打包編譯生成一個單獨可執行文件。具備高效的 startup 及較小的運行時內存開銷的優點。框架
但 GraalVM 並未內置只是提供 gu 安裝工具,須要咱們單獨安裝。curl
- 切換到 jdk 的安裝目錄 ⋊> ~ cd $JAVA_HOME/bin/ - 使用gu命令安裝 ⋊> ./gu install native-image
curl https://start.spring.io/starter.zip -d dependencies=web \ -d bootVersion=2.4.1 -o graal-demo.zip
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
<!-- 新增的部分,注意須要增長 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>
@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
在 targe 目錄生成 名稱爲 com.example.demo.demoapplication
可執行文件
cd target ./com.example.demo.demoapplication
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)
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 |