知識庫 / Spring / Spring Boot RSS 訂閱

配置 Spring Boot 應用程序啓動時的堆大小

JVM,Spring Boot
HongKong
4
12:41 PM · Dec 06 ,2025

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 參數的特定方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.