如何將開發環境的 Spring Boot 應用程式記憶體降低 40% 以上
來源:waynblog
本文翻譯自:https://medium.com/@satanjim/how-we-reduced-the-memory-consumption-of-spring-boot-application-over-40-for-the-development-c8a5813fac23
在開發基礎的 Spring Boot 應用程式時,我們需要考慮可承受的記憶體消耗。隨著新增更多依賴項,記憶體消耗也會增加。對於整體應用程式,通常仍然可以承受記憶體消耗,但當我們開發多個微服務並在本地計算機上執行時,這可能成為一場噩夢,影響開發效率。
Spring Boot 和 JVM 都帶有一些預設配置,適用於大多數情況,甚至在某些生產環境中也能勝任。但是如果我們能調整一些配置來適應本地開發,就可以顯著減少記憶體消耗。請注意,我不是 JVM 和 Spring Boot 方面的專家,只是想在這篇文章中分享一些我自己的經驗。
誰消耗了記憶體
首先,讓我們瞭解一下,到底是誰在消耗記憶體呢?沒錯,是 JVM。但是它是如何做到的呢?
要深入瞭解這個問題,我們需要了解 JVM 的內部結構,但這超出了本文的範圍。簡單來說,JVM 的記憶體消耗可以分成堆(Heap)、元空間(Metaspace)、每個執行緒的堆疊(Thread Stack)以及其他。
為了減少記憶體消耗,我們需要向 JVM 顯式地傳遞一些引數。
首先,我們需要進行一些前置準備:
安裝 Docker 和 docker-compose 使用 Java 17 版本(但是 8 到最新版本之間的任何版本應該都可以,除了 Java 8 中的一些舊補丁) 使用 Spring Boot
接下來,我們可以配置一些引數。建立一個名為"dev.jvm.conf"的檔案,並輸入以下值(稍後我們會解釋這些值的含義):
# dev.jvm.conf
# 覆蓋應用程式的屬性
SERVER_TOMCAT_ACCEPT_COUNT=3
SERVER_TOMCAT_MAX_CONNECTIONS=3
SERVER_TOMCAT_THREADS_MAX=3
SERVER_TOMCAT_THREADS_MIN_SPARE=1
SPRING_MAIN_LAZY_INITIALIZATION=true
# 設定JVM引數
JAVA_TOOL_OPTIONS=-XX:+UseSerialGC -Xss512k -XX:MaxRAM=200m
然後,我們使用 docker-compose 將這些環境變數傳遞到容器中:
# docker-compose.yml
services:
service1:
image: service1:dev
env_file:
- dev.jvm.conf
service2:
image: service2:dev
env_file:
- dev.jvm.conf
現在執行docker-compose up
命令,您應該能看到一些差異。
接下來,讓我們詳細討論一下這些配置
在開始之前,請記住,降低某些值不會直接減少本地環境中的記憶體使用量,因為本地環境中通常不會有那麼多請求。我們新增閾值的目的是,即使在本地環境中,如果我們開始收到更多請求,也要限制其數量。這最終將有助於限制記憶體使用。
SERVER_TOMCAT_ACCEPT_COUNT:該屬性設定了當所有可能的請求處理執行緒都在使用時,傳入連線請求的最大佇列長度。當伺服器負載較重且所有工作執行緒都繁忙時,傳入的請求將被放入佇列中。如果佇列已滿,額外的連線請求將被拒絕。預設值為 100。
SERVER_TOMCAT_MAX_CONNECTIONS:該屬性定義了 Tomcat 伺服器同時能夠處理的最大連線數。預設值為 8192。
SERVER_TOMCAT_THREADS_MAX:該屬性控制 Tomcat 伺服器將建立的請求處理執行緒的最大數量。預設值為 200。
SERVER_TOMCAT_THREADS_MIN_SPARE:該屬性為嵌入式 Tomcat 伺服器設定了最小備用執行緒數。預設值為 10。
SPRING_MAIN_LAZY_INITIALIZATION:將該屬性值設定為 true 意味著應用程式中的所有 bean 都將延遲初始化。這將有助於縮短啟動時間。
JAVA_TOOL_OPTIONS:使用該屬性,我們可以向 JVM 傳遞一些額外的引數。讓我們來談談其中的每個引數意義。
-XX:+UseSerialGC:這個引數會使 JVM 使用單執行緒進行內聯垃圾收集,而不是使用專用的 GC 執行緒。 -Xss512k:這個引數將每個執行緒的堆疊大小限制為 512KB,而不是預設的 1MB。 -XX:MaxRAM=200m:這個引數設定 JVM 最大可使用的 RAM 記憶體為 200MB。
這是一些簡單的調整,但它們可以在本地開發環境中顯著減少記憶體消耗。當然,根據您的具體情況,您可能需要進一步進行調整。這只是一個起點,您可以根據實際需求進行最佳化。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3003852/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Boot 和 Spring Cloud 應用記憶體如何管理?Spring BootCloud記憶體
- 簡單實用的pandas技巧:如何將記憶體佔用降低90%記憶體
- 簡單又實用的pandas技巧:如何將記憶體佔用降低90%記憶體
- Windows10 Java Spring boot 開發環境搭建WindowsJavaSpring Boot開發環境
- 基於spring-boot&spring-data-jpa的web開發環境整合SpringbootWeb開發環境
- 基於spring boot 及mybatis的web開發環境搭建Spring BootMyBatisWeb開發環境
- spring boot環境抽象Spring Boot抽象
- 用 Spring 區分開發環境、測試環境、生產環境Spring開發環境
- 應用 AddressSanitizer 發現程式記憶體錯誤記憶體
- 用Spring Boot顛覆Java應用開發Spring BootJava
- 如何將Redis記憶體使用量降低一半? - DEVRedis記憶體dev
- Fedora 上的桌面環境記憶體佔用測試記憶體
- Spring Boot RCE到記憶體馬探索Spring Boot記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- Spring Boot 應用程式中的 QueryDSLSpring Boot
- Netweaver工作程式的記憶體限制 VS CloudFoundry應用的記憶體限制記憶體Cloud
- 減少Spring Boot的JVM記憶體佔用的Docker三種配置Spring BootJVM記憶體Docker
- 如何在生產環境中通過Restful API的方式請求重啟Spring Boot應用?RESTAPISpring Boot
- Spring Boot heapdump洩露記憶體分析方法Spring Boot記憶體
- Spring boot應用如何支援httpsSpring BootHTTP
- 如何在生產環境排查 Rust 記憶體佔用過高問題Rust記憶體
- Spring Boot - Profile不同環境配置Spring Boot
- 生產環境Java應用服務記憶體洩漏分析與解決Java記憶體
- Win10開機後記憶體佔用高80%以上怎麼回事 Win10開機後記憶體佔用高80%以上的處理方法Win10記憶體
- Redis 實戰 —— 12. 降低記憶體佔用Redis記憶體
- Spring Boot應用程式有哪些功能?Spring Boot
- Spring Boot + Kotlin + Coroutines應用演示程式Spring BootKotlin
- Spring Boot應用程式事件教程 - reflectoringSpring Boot事件
- Spring Boot應用,使用native編譯與不使用的啟動時間和記憶體佔用對比Spring Boot編譯記憶體
- window下使用nw.js開發桌面應用程式環境的搭建JS
- 如何預熱Spring Boot應用? - sebsteinSpring Boot
- 深度解讀昇騰CANN記憶體複用技術,降低網路記憶體佔用記憶體
- 【高併發】高併發環境下如何防止Tomcat記憶體溢位?看完我懂了!!Tomcat記憶體溢位
- win10如何降低chrome記憶體佔用_win10電腦chrome記憶體佔用過高怎麼辦Win10Chrome記憶體
- 如何將Spring Boot應用中日誌輸出格式改為JSON?-DEVSpring BootJSONdev
- Spring Boot 應用程式啟動流程分析Spring Boot
- Java 應用程式在 Kubernetes 上棘手的記憶體管理Java記憶體
- Spring Boot應用程式中的常用註釋列表Spring Boot