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-adptsdk default java 11.0.9.hs-adpt
不過安裝過程中需要從國外下載相關資源 ,筆者在嘗試后使用體驗并不是很好,所有建議大家下載指定版本 GraalVM 安裝即可(和 JDK 安裝方式一樣)。
安裝成功查看版本
⋊> ~ java -version 11:30:34openjdk version '11.0.9' 2020-10-20OpenJDK 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.jarengine: [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 WebApplicationContext2020-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/java480.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.demoapplication24.8203MB
數據對比
是否引入 GraalVM 內存占用 啟動時間 否 480.965MB 1135 ms 是 24.8203MB 215 ms
到此這篇關于Spring Boot 2.4新特性減少95%內存占用問題的文章就介紹到這了,更多相關Spring Boot 2.4新特性內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章:
1. .NET SkiaSharp 生成二維碼驗證碼及指定區域截取方法實現2. css代碼優化的12個技巧3. HTTP協議常用的請求頭和響應頭響應詳解說明(學習)4. ASP.NET MVC通過勾選checkbox更改select的內容5. CentOS郵件服務器搭建系列—— POP / IMAP 服務器的構建( Dovecot )6. IntelliJ IDEA創建web項目的方法7. Django使用HTTP協議向服務器傳參方式小結8. idea設置提示不區分大小寫的方法9. 原生JS實現記憶翻牌游戲10. ASP中實現字符部位類似.NET里String對象的PadLeft和PadRight函數
