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.xml
的 spring-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