如何將開發環境的 Spring Boot 應用程式記憶體降低 40% 以上

ITPUB社群發表於2024-01-15


來源: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)以及其他。

如何將開發環境的 Spring Boot 應用程式記憶體降低 40% 以上

為了減少記憶體消耗,我們需要向 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章