在 Spring Boot 应用中配置 JVM 的内存和 CPU 使用,主要通过设置 JVM 参数来实现。下面详细介绍如何配置 Spring Boot 应用的 内存 和 CPU 相关参数,适用于本地开发、测试环境或生产部署(如 Linux 服务器、Docker 容器等)。
🧠 一、配置 JVM 内存参数
Spring Boot 是基于 Java 的应用,所以其内存配置本质上是配置 JVM 的内存参数。
1. 常见内存参数
| 参数 | 说明 |
|---|---|
-Xms |
初始堆内存大小 |
-Xmx |
最大堆内存大小 |
-XX:MetaspaceSize |
元空间初始大小(Java 8+) |
-XX:MaxMetaspaceSize |
元空间最大大小 |
-Xss |
每个线程的栈大小 |
-XX:+HeapDumpOnOutOfMemoryError |
OOM 时生成堆转储文件 |
-XX:HeapDumpPath |
堆转储文件保存路径 |
2. 示例配置
方式一:启动命令中指定(推荐)
java -Xms512m -Xmx2g
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
-jar your-application.jar
方式二:通过 JAVA_TOOL_OPTIONS 环境变量
export JAVA_TOOL_OPTIONS="-Xms512m -Xmx2g"
⚠️ 注意:
JAVA_TOOL_OPTIONS对所有 Java 应用生效,慎用。
方式三:在脚本中封装启动命令
#!/bin/bash
java -Xms512m -Xmx2g
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
-jar /path/to/your-application.jar > /dev/null 2>&1 &
⚙️ 二、限制 CPU 使用(非 JVM 参数)
JVM 本身不提供限制 CPU 使用的参数,但可以通过操作系统或容器层面来限制 CPU 使用。
1. Linux 系统下使用 cpulimit
sudo apt install cpulimit
cpulimit -l 50 -p <PID>
-l 50表示限制最多使用 50% 的 CPU。<PID>是 Java 进程的 PID。
2. Docker 容器中限制 CPU
docker run -d
--name my-springboot-app
--cpus="1.5"
-e JAVA_TOOL_OPTIONS="-Xms512m -Xmx2g"
my-springboot-image
--cpus="1.5"表示最多使用 1.5 个 CPU 核心。
3. Kubernetes 中限制 CPU 资源
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "1"
memory: "2Gi"
📊 三、监控内存和 CPU 使用情况
1. 内置监控(Spring Boot Actuator)
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启用端点:
management:
endpoints:
web:
exposure:
include: "*"
访问:
http://localhost:8080/actuator/metrics/jvm.memory.used
http://localhost:8080/actuator/metrics/system.cpu.usage
2. 外部工具
- VisualVM / JConsole:图形化监控 JVM 内存和线程。
- Prometheus + Grafana:用于生产环境监控。
- Micrometer:Spring Boot 原生支持的指标库。
📌 四、建议的生产环境配置(示例)
java -Xms2g -Xmx4g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-Xss512k
-XX:+UseG1GC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/app/oom.hprof
-jar your-app.jar
✅ 总结
| 项目 | 推荐配置 |
|---|---|
初始堆内存 -Xms |
与 -Xmx 一致,避免频繁 GC |
| Metaspace | 设置 MetaspaceSize 和 MaxMetaspaceSize |
| GC 算法 | 推荐 G1GC(-XX:+UseG1GC) |
| CPU 限制 | 通过 Docker/K8s/系统工具控制 |
| 内存溢出处理 | -XX:+HeapDumpOnOutOfMemoryError |
如果你提供具体的部署环境(如 Docker、K8s、裸机等),我可以给出更具体的配置建议。需要我帮你写一个完整的启动脚本或 Dockerfile 吗?
ECLOUD博客