小宇宙爆發!Spring Boot 節省95%內存佔用

2020-12-28 程序猿DD

GraalVM[1] 是一種高性能的虛擬機,它可以顯著的提高程序的性能和運行效率,非常適合微服務。最近比較火的 Java 框架 Quarkus[2] 默認支持 GraalVM

下圖為 Quarkus 和傳統框架(SpringBoot) 等對比圖,更快的啟動數據、更小的內存消耗、更短的服務響應

Spring Boot 2.4 開始逐步提供對 GraalVM 的支持,旨在提升上文所述的 啟動、內存、響應的使用體驗

安裝 GraalVM

目前官方社區版本最新為 20.3.0 ,是基於 OpenJDK 8u272 and 11.0.9 定製的,可以理解為 OpenJDK 的衍生版本 。

官方推薦的是 SDKMAN[3] 用於快速安裝和切換不同版本 JDK 的工具 ,類似於 nodejs 的 nvm[4]。使用類似命令即可完成指定版本安裝和指定默認版本

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/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)使用 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 可執行文件

啟動應用 這裡執行的編譯後的可執行文件而不是 jarcd target./com.example.demo.demoapplication啟動時間 0.215 seconds2020-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.8203MBps aux | grep com.example.demo.demoapplication | grep -v grep | awk '{print $11 "\t" $6/1024"MB" }'./com.example.demo.demoapplication 24.8203MB數據對比

是否引入 GraalVM內存佔用啟動時間否480.965MB1135 ms是24.8203MB215 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

作者 | 冷冷來源 | https://mp.weixin.qq.com/s/0m6ofmMlQTDUQwC7oRRIrQ

相關焦點

  • Spring Boot 2.4 正式發布,重大調整!!!
    更多細節可參考:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide如果你想繼續使用 Spring Boot 2.3 的配置邏輯,也可以通過在
  • Spring Boot與Shiro整合實現用戶認證
    ;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration
  • Spring Boot 2.3.0 發布 - OSCHINA - 中文開源技術交流社區
    > Couchbase Client 3.0 Elasticsearch 7.6 Kafka 2.5 Micrometer 1.5 MongoDB 4.0 支持 Java 14spring
  • Spring Boot集成validation用於優雅的校驗API參數的合法性
    ,郵箱格式是否正確等等,校驗框架比較多,用的比較多的是hibernate-validator, 也支持國際化,也可以自定義校驗類型的註解,這裡只是簡單的演示校驗框架在Spring Boot中的簡單集成,要想了解更多可以參考 hibernate-validator1. pom.xml<dependency> <groupId>org.springframework.boot
  • Spring Boot 2.4.3、2.3.9 版本發布,你準備好了嗎?
    心急的小夥伴現在可從 repo.spring.io 和 Maven Central 獲得相關內容。<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.4.3</version>
  • Spring Security(二)--Guides
    作者:老徐原文地址:https://www.cnkirito.moe/2017/09/20/spring-security-2/友情提示:歡迎關注公眾號【芋道源碼】。😈關注後,拉你進【源碼圈】微信群和【老徐】搞基嗨皮。友情提示:歡迎關注公眾號【芋道源碼】。
  • iPhone內存告急?這四個方法,讓你快速節省內存空間!
    蘋果手機私密性高,安全性也高,因為APP store審核嚴格,也不會下載一些有的沒的軟體,所以同樣的64GB內存,iPhone流暢度比安卓始終要高一些。但是隨著日益增加的APP需求,部分小內存的iPhone,也需要及時的將空間騰出來。下面小編教大家節省內存的4個方法。
  • 小宇宙爆發?小宇宙爆發?小宇宙爆發?新常態!新常態!新常態!
    小宇宙爆發?小宇宙爆發?小宇宙爆發?新常態!新常態!新常態!原標題:《小宇宙爆發?小宇宙爆發?小宇宙爆發?新常態!新常態!新常態!》
  • 學習學習SpringSecurity
    初階 Spring Security添加maven依賴<dependency><groupId>org.springframework.boot</groupId>><artifactId>spring-boot-starter-security</artifactId></dependency>重新部署,會看到一個登陸頁面。
  • 手機內存不足?關閉微信這2個功能,可節省大量內存!
    觸觸的手機就是被微信,佔據了很多內存而聊天記錄內的照片和視頻絕對是佔據微信內存的兩大「殺手」如果不及時清理,日積月累也會佔用許多內存空間。沒想到只是這樣,我滴內存就悄悄的木有鳥~難怪觸觸每次看存儲空間,微信佔的這麼大!
  • 如何用Spring Boot和Cloud實現微服務
    有關如何使用Spring Cloud來構建Gateway的內容,請訪問https://spring.io/projects/spring-cloud-gateway。如果您想了解更多有關如何使用Spring Cloud,來輕鬆創建Config Server的詳細內容,請參見--https://spring.io/projects/spring-cloud-config。
  • 別再天天清理手機了,把微信這個「功能」關掉,就能節省大量內存
    別再天天清理手機了,把微信這個「功能」關掉,就能節省大量內存!在網際網路資訊時代,對於人們的生活而言,手機已經成為必不可缺的一部分,在大街上,「低頭族」越來越多,因為手機對於人們的生活,也確實產生了很大的影響,不管是衣食住行,我們都需要使用手機,但對於一些老用戶而言,手機用了一定的時間後,就會出現兩個明顯的問題,一個是電池續航變差,另一個就是內存不夠用。
  • 電腦內存佔用過高!怎麼解決?
    當電腦出現內存佔用太高,內存不足,磁碟空間不足的情況時,電腦將顯得卡頓不流暢,運行速度也越來越慢。那麼,如何解決高內存使用和電腦卡頓的問題呢?接下來就讓我們來看看吧!
  • 關閉微信這兩個功能,可以節省大量內存空間
    身為一名重症手機控患者,「對不起,你的內存已滿」,能給人帶來一萬點傷害……拍照不能拍,軟體下載不了
  • springboot+springsecurity實現前後端分離簡單實現!
    看springsecurtiy原理圖的時候以為灑灑水,結果自己動手做的時候一竅不通,所以一定不要眼高手低,實踐出真知!通過各種方式學習springsecurity,在B站、騰訊課堂、網易課堂、慕課網沒有springsecurity的前後端分離的教學視頻,那我就去csdn去尋找springsecurity博客,發現幾個問題:要麼就是前後端不分離,要麼就是通過內存方式讀取數據,而不是通過資料庫的方式讀取數據,要麼就是大佬們給的代碼不全、把代碼講的太繞,關鍵部分沒有注釋
  • 電腦提示svchost佔用內存過高怎麼辦
    svchost佔用過多內存是否有解決方案?如何設置svchost佔用的內存太高? svchost佔用太多內存,解決方案教程在哪裡?連續三個問題讓我感到一臉問號,這是什麼?所以小編迅速查閱了相關信息,發現這是Windows Update服務引起的。知道了原因,解決方法很簡單。
  • 小宇宙爆發...
    百木希,日文名:ももき希、ももきのぞみ,英文名:Momoki Nozomi,是日本AV女優、寫真女優,2015年10月16日出道,百木希(ももき希)有著大大的眼睛、有點嬰兒肥的蘿莉臉蛋配上嬌小的個子和還算有肉的上圍讓她看來非常可口,為了配合「性經驗僅3次」所以又清純又害羞甚至還很害怕被插入的表情應該也會讓許多影迷的小宇宙爆發
  • 怎麼解決win10系統內存佔用過高
    不過很多用戶都對win10系統不太了解,比如說,win10系統內存佔用過高怎麼辦?遇到這個問題應該怎麼解決?今天系統總裁小編就給大家帶來了怎麼解決win10系統內存佔用過高得操作步驟。 方法一、 1、滑鼠右鍵點擊「開始菜單」,選擇「任務管理器」選項。打開任務管理器界面後,選擇右鍵點擊多餘進程,選擇關閉。
  • 關閉微信這2個功能,可節省大量內存空間!
    而聊天記錄內的照片和視頻更是堪稱佔據微信內存的兩大「殺手」需要說明的是下面這個技巧並不是簡單的教大家清理緩存信息釋放內存空間而是微信新版本提供的2項優化內存功能測試微信版本:6.5.3比方說,日常生活中,當我們在微信上拍的視頻和圖片信息發送給好友後,系統會將這些信息自動保存在系統中,如果不及時清理,日積月累也會佔用許多內存空間。
  • 內存佔用率過高怎麼辦?Win10電腦內存佔用率很高的原因和解決方法
    內存佔用率過高,是電腦十分常見的電腦故障,出現的現象就是什麼軟體還沒有打開,內存佔用了70%以上,甚至是99%,出現電腦明顯卡頓的問題。不過想要解決內存佔用率高不是簡單的事情,因為可能性比較多,可能是某個軟體導致的,也有可能是系統服務所致,也有驅動程序導致的問題等,需要對症下藥才可以解決問題。那麼內存佔用率過高怎麼辦?