1. 簡介
本教程將學習如何在啓動 Spring Boot 應用程序時配置堆大小。我們將配置 -Xms 和 -Xmx 設置,它們分別對應啓動堆大小和最大堆大小。
接下來,我們將首先使用 Maven 來配置啓動應用程序時的堆大小,通過在命令行中使用 mvn 命令。我們還將瞭解如何使用 Maven 插件設置這些值。然後,我們將把應用程序打包成 jar 文件,並使用 java -jar 命令提供 JVM 參數運行它。
最後,我們將創建一個 .conf 文件,該文件設置 JAVA_OPTS,並使用 Linux System V Init 技術以服務形式運行我們的應用程序。
2. 從 Maven 中運行
2.1. 通過傳遞 JVM 參數
讓我們先創建一個簡單的 REST 控制器,它返回一些基本的內存信息,以便我們用於驗證我們的設置:
@GetMapping("memory-status")
public MemoryStats getMemoryStatistics() {
MemoryStats stats = new MemoryStats();
stats.setHeapSize(Runtime.getRuntime().totalMemory());
stats.setHeapMaxSize(Runtime.getRuntime().maxMemory());
stats.setHeapFreeSize(Runtime.getRuntime().freeMemory());
return stats;
}讓我們直接運行它,使用 mvn spring-boot:run 獲取一個基準。 一旦我們的應用程序啓動,我們就可以使用 curl 調用我們的 REST 控制器:
curl http://localhost:8080/memory-status我們的結果會因我們的機器而異,但大致會像下面這樣:
{"heapSize":333447168,"heapMaxSize":5316280320,"heapFreeSize":271148080}對於 Spring Boot 2.x,我們可以使用 -Dspring-boot.run 參數傳遞應用程序的參數。
讓我們使用 -Dspring-boot.run.jvmArguments 參數將起始堆大小和最大堆大小傳遞給應用程序:
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"現在,當我們訪問我們的端點時,我們應該看到我們指定的堆設置:
{"heapSize":2147483648,"heapMaxSize":4294967296,"heapFreeSize":2042379008}2.2. 使用 Maven 插件
我們可以通過在我們的 pom.xml 文件中配置 spring-boot-maven-plugin,從而避免每次運行應用程序時都需要提供參數:
讓我們配置插件以設置我們所需的堆大小:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>com.baeldung.heap.HeapSizeDemoApplication</mainClass>
</configuration>
</execution>
</executions>
<configuration>
<executable>true</executable>
<jvmArguments>
-Xms256m
-Xmx1g
</jvmArguments>
</configuration>
</plugin>
</plugins>現在,我們可以僅使用 mvn spring-boot:run 運行我們的應用程序,並在對端進行 ping 時,看到我們指定的 JVM 參數正在使用。
{"heapSize":259588096,"heapMaxSize":1037959168,"heapFreeSize":226205152}插件中我們配置的任何JVM參數將優先於使用 Maven 執行時提供的參數,即使使用了 -Dspring-boot.run.jvmArguments 選項。
3. 使用 java -jar
如果我們要從 jar 文件中運行我們的應用程序,我們可以向 java 命令提供 JVM 參數。
首先,我們必須在 Maven 文件中指定打包方式為 jar。
<packaging>jar</packaging>然後,我們可以將我們的應用程序打包成一個 JAR 文件:
mvn clean package現在我們有了我們的 JAR 文件,可以使用 java -jar 運行它,並覆蓋堆配置:
java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar讓我們使用 curl 命令來檢查內存值:
{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}4. 使用 .conf 文件
最後,我們將學習如何使用 .conf 文件來設置應用程序在作為 Linux 服務運行時堆大小。
讓我們首先創建一個名稱與我們的應用程序 jar 文件相同,並帶有 .conf 擴展名的文件:spring-boot-runtime-2.conf。
我們可以將它放在資源目錄下的一個文件夾中,並將堆配置添加到 JAVA_OPTS 中:
JAVA_OPTS="-Xms512m -Xmx1024m"接下來,我們將修改我們的 Maven 構建,將 spring-boot-runtime-2.conf 文件複製到我們的 target 文件夾中,與我們的 jar 文件旁:
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/resources/heap</directory>
<targetPath>${project.build.directory}</targetPath>
<filtering>true</filtering>
<includes>
<include>${project.name}.conf</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>com.baeldung.heap.HeapSizeDemoApplication</mainClass>
</configuration>
</execution>
</executions>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>我們還需要將 可執行 設置為 true,以便我們的應用程序以服務模式運行。
我們可以使用 Maven 打包我們的 jar 文件並將我們的 .conf 文件複製過來。
mvn clean package spring-boot:repackage讓我們創建我們的 init.d 服務:
sudo ln -s /path/to/spring-boot-runtime-2.jar /etc/init.d/spring-boot-runtime-2現在,我們開始我們的應用程序:
sudo /etc/init.d/spring-boot-runtime-2 start然後,當我們在目標端點處執行操作時,我們應該確認我們的 JAVA_OPT 值,這些值在 .conf 文件中指定,已被正確地應用。
{"heapSize":538968064,"heapMaxSize":1073741824,"heapFreeSize":445879544}5. 結論
在本教程中,我們探討了如何為三種常見的 Spring Boot 應用運行方式覆蓋 Java 堆設置方法。我們首先使用 Maven,既修改了命令行中的值,也通過 Spring Boot Maven 插件設置了它們。
接下來,我們使用 jar 文件運行我們的應用程序,並通過 java -jar 傳遞 JVM 參數。
最後,我們研究了一種可能的生產級解決方案,即在我們的胖 jar 文件旁邊設置一個 .conf 文件,併為我們的應用程序創建 System V init 服務。
還有其他解決方案可以從 Spring Boot 胖 jar 文件中創建服務和守護進程,許多解決方案都提供了覆蓋 JVM 參數的特定方法。