Spring Boot 2.4新特性減少95%內(nèi)存占用問題
節(jié)省 95%的內(nèi)存占用,減少 80%的啟動(dòng)耗時(shí)。
GraalVM 是一種高性能的虛擬機(jī),它可以顯著的提高程序的性能和運(yùn)行效率,非常適合微服務(wù)。最近比較火的 Java 框架 Quarkus 默認(rèn)支持 GraalVM
下圖為 Quarkus 和傳統(tǒng)框架(SpringBoot) 等對比圖,更快的啟動(dòng)速度、更小的內(nèi)存消耗、更短的服務(wù)響應(yīng)。
Spring Boot 2.4 開始逐步提供對 GraalVM 的支持,旨在提升上文所述的 啟動(dòng)、內(nèi)存、響應(yīng)的使用體驗(yàn)。
安裝 GraalVM目前官方社區(qū)版本最新為 20.3.0 ,是基于 OpenJDK 8u272 and 11.0.9 定制的,可以理解為 OpenJDK 的衍生版本。
官方推薦的是 SDKMAN 用于快速安裝和切換不同版本 JDK 的工具 ,類似于 nodejs 的 nvm。
使用類似命令即可完成指定版本安裝和指定默認(rèn)版本
sdk install java 11.0.9.hs-adptsdk default java 11.0.9.hs-adpt
不過安裝過程中需要從國外下載相關(guān)資源 ,筆者在嘗試后使用體驗(yàn)并不是很好,所有建議大家下載指定版本 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 開發(fā)的一種 AOT 編譯器,應(yīng)用所需的 class 依賴項(xiàng)及 runtime 庫打包編譯生成一個(gè)單獨(dú)可執(zhí)行文件。具有高效的 startup 及較小的運(yùn)行時(shí)內(nèi)存開銷的優(yōu)勢。
但 GraalVM 并未內(nèi)置只是提供 gu 安裝工具,需要我們單獨(dú)安裝。
- 切換到 jdk 的安裝目錄⋊> ~ cd $JAVA_HOME/bin/- 使用gu命令安裝⋊> ./gu install native-image初始化 Spring Boot 2.4 項(xiàng)目
Spring Initializr 創(chuàng)建 demo 項(xiàng)目
curl https://start.spring.io/starter.zip -d dependencies=web -d bootVersion=2.4.1 -o graal-demo.zip
先看一下啟動(dòng)基準(zhǔn)數(shù)據(jù) , 單純運(yùn)行空項(xiàng)目 需要 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
內(nèi)存占用情況
ps aux | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk ’{print $11 't' $6/1024'MB' }’/usr/bin/java480.965MB支持 GraalVM
增加相關(guān)依賴,涉及插件較多完整已上傳 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 構(gòu)建可執(zhí)行文件
mvn -Pnative package
#構(gòu)建過程比較慢,日志如下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編譯結(jié)果
在 targe 目錄生成 名稱為 com.example.demo.demoapplication 可執(zhí)行文件
啟動(dòng)應(yīng)用 這里執(zhí)行的編譯后的可執(zhí)行文件而不是 jar
cd target./com.example.demo.demoapplication
啟動(dòng)時(shí)間 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)
看一下內(nèi)存占用 24.8203MB
ps aux | grep com.example.demo.demoapplication | grep -v grep | awk ’{print $11 't' $6/1024'MB' }’./com.example.demo.demoapplication24.8203MB
數(shù)據(jù)對比
是否引入 GraalVM 內(nèi)存占用 啟動(dòng)時(shí)間 否 480.965MB 1135 ms 是 24.8203MB 215 ms
到此這篇關(guān)于Spring Boot 2.4新特性減少95%內(nèi)存占用問題的文章就介紹到這了,更多相關(guān)Spring Boot 2.4新特性內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Java發(fā)送http請求的示例(get與post方法請求)2. JS繪圖Flot如何實(shí)現(xiàn)動(dòng)態(tài)可刷新曲線圖3. springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案4. 關(guān)于探究python中sys.argv時(shí)遇到的問題詳解5. 基于android studio的layout的xml文件的創(chuàng)建方式6. CSS自定義滾動(dòng)條樣式案例詳解7. 使用ProcessBuilder調(diào)用外部命令,并返回大量結(jié)果8. Intellij IDEA官方最完美編程字體Mono使用9. python使用requests庫爬取拉勾網(wǎng)招聘信息的實(shí)現(xiàn)10. IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決
