1. 简介

本文将介绍在启动 Spring Boot 应用时,如何配置 JVM 堆内存大小。我们将重点配置 -Xms-Xmx 参数,分别表示初始堆大小和最大堆大小。

我们会先通过 Maven 命令行启动应用,并传入 JVM 参数;接着介绍如何在 Maven 插件中固化这些参数;然后打包成 jar 文件并通过 java -jar 启动时设置堆大小;最后演示如何使用 .conf 配置文件,在 Linux 系统下以服务方式运行 Spring Boot 应用并配置堆内存。

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 调用接口查看默认内存信息:

curl http://localhost:8080/memory-status

输出示例(具体数值因机器而异):

{"heapSize":333447168,"heapMaxSize":5316280320,"heapFreeSize":271148080}

在 Spring Boot 2.x 中,可以通过 -Dspring-boot.run.jvmArguments 传递 JVM 参数:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"

再次调用接口,可以看到堆内存配置已生效:

{"heapSize":2147483648,"heapMaxSize":4294967296,"heapFreeSize":2042379008}

2.2. 在 Maven 插件中固化配置

为了避免每次都要手动传参数,我们可以在 pom.xmlspring-boot-maven-plugin 中配置 JVM 参数:

<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

调用接口可看到配置生效:

{"heapSize":259588096,"heapMaxSize":1037959168,"heapFreeSize":226205152}

提示:插件中配置的 JVM 参数优先级高于命令行传入的 -Dspring-boot.run.jvmArguments

3. 使用 java -jar 启动

如果应用已打包为 jar 文件,可以通过 java -jar 命令并传入 JVM 参数来设置堆大小。

首先确保 pom.xml 中指定了打包方式为 jar:

<packaging>jar</packaging>

接着打包应用:

mvn clean package

运行 jar 并设置堆大小:

java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar

调用接口验证:

{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}

4. 使用 .conf 文件配置堆大小

在 Linux 环境下将 Spring Boot 应用作为服务运行时,可以通过同名 .conf 文件设置 JAVA_OPTS

4.1. 创建 .conf 文件

创建一个与 jar 文件同名的 .conf 文件,例如:

spring-boot-runtime-2.conf

内容如下:

JAVA_OPTS="-Xms512m -Xmx1024m"

4.2. Maven 配置自动复制 .conf 文件

配置 pom.xml,使构建时自动将 .conf 文件复制到 target 目录:

<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>

⚠️ 注意:必须设置 <executable>true</executable> 才能以服务方式运行。

4.3. 构建并运行服务

打包应用:

mvn clean package spring-boot:repackage

创建软链接到 /etc/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

调用接口验证配置是否生效:

{"heapSize":538968064,"heapMaxSize":1073741824,"heapFreeSize":445879544}

踩坑提醒.conf 文件必须放在与 jar 文件同目录下,且文件名一致。

5. 总结

本文介绍了三种常见的 Spring Boot 应用启动方式下如何配置堆内存大小:

  • ✅ 使用 Maven 启动时传入 JVM 参数;
  • ✅ 在 Maven 插件中固化配置;
  • ✅ 打包为 jar 后通过 java -jar 启动;
  • ✅ 使用 .conf 文件配合 System V init 服务运行。

不同方式适用于不同场景,合理选择可提升部署效率和运行稳定性。

示例代码可在 GitHub 查看:https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-runtime-2


原始标题:Configure the Heap Size When Starting a Spring Boot Application | Baeldung