Spring Boot 项目在使用内嵌 Tomcat 容器时的系统资源占用(主要是内存和 CPU)因多种因素而异,但我们可以给出一个典型范围作为参考:
📌 一、内存占用(JVM 堆内存)
| 场景 | 初始堆内存(-Xms) | 最大堆内存(-Xmx) | 实际使用量(运行时) |
|---|---|---|---|
| 极简项目(仅启动,无业务逻辑) | 64–128 MB | 256–512 MB | 80–150 MB |
| 普通 Web 项目(含 Controller、Service、数据库连接等) | 128–256 MB | 512 MB–1 GB | 200–400 MB |
| 复杂项目(大量 Bean、缓存、消息队列、监控等) | 512 MB | 1–2 GB | 600 MB–1.5 GB |
⚠️ 注意:JVM 总内存 = 堆内存 + 非堆内存(元空间 Metaspace、线程栈、直接内存等),通常额外增加 100–300 MB。
✅ 建议最小配置:
- 内存:512 MB ~ 1 GB RAM 可稳定运行大多数中小型 Spring Boot 应用。
- 生产环境建议设置
-Xms和-Xmx相同以避免动态扩容开销。
📌 二、CPU 占用
- 空闲状态(无请求):接近 0% 或极低(<1%)
- 轻度负载(每秒几个请求):1%–5%
- 中高负载(复杂业务、并发 50+):可上升至 20%–70%,取决于业务逻辑复杂度
CPU 使用率高度依赖于:
- 是否有定时任务
- 数据库/外部服务调用频率
- 日志级别(DEBUG 会显著增加 CPU)
- 是否启用监控(如 Actuator + Prometheus)
📌 三、线程数(Tomcat 内嵌默认配置)
Spring Boot 内嵌 Tomcat 默认线程池配置:
server:
tomcat:
max-threads: 200 # 最大工作线程数(默认)
min-spare-threads: 10 # 最小空闲线程(默认)
每个线程默认栈大小约 1 MB(可通过 -Xss 调整),因此 200 个线程 ≈ 200 MB 栈内存(理论上限,实际不会全用满)。
📌 四、影响资源消耗的关键因素
| 因素 | 影响说明 |
|---|---|
| Spring Boot 版本 | 新版本更优化,但功能更多可能略增开销 |
| 依赖数量(如 Spring Data JPA、Security、Cloud) | 每多一个模块,Bean 更多,启动慢,内存高 |
| 日志级别 | DEBUG 级别日志显著增加 I/O 和 CPU |
| 是否启用 Actuator、Prometheus、Zipkin 等监控 | 增加内存和少量 CPU 开销 |
| JVM 参数优化 | 合理设置堆、GC 策略可降低峰值内存和停顿 |
✅ 示例:一个典型的 Spring Boot Web 项目
@RestController
@SpringBootApplication
public class DemoApp {
public static void main(String[] args) {
SpringApplication.run(DemoApp.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello";
}
}
- 依赖:spring-boot-starter-web
- 无数据库,无安全控制
- 打包为 jar,运行命令:
java -jar app.jar
📊 资源占用实测参考(JDK 17, macOS/Linux):
- 启动后内存使用:~180 MB(RSS)
- CPU(空闲):<1%
- 启动时间:2–4 秒
🔧 优化建议(降低资源占用)
- 精简依赖:只引入必要的 Starter。
- 调整 JVM 参数:
java -Xms128m -Xmx256m -XX:+UseG1GC -jar app.jar - 关闭不必要的自动配置:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) - 使用轻量级替代方案:
- 用 Undertow 或 Jetty 替代 Tomcat(稍轻量)
- 使用 GraalVM Native Image 编译为原生镜像(内存可降至 30–50 MB,启动毫秒级)
✅ 总结
| 项目类型 | 推荐最小内存 | 典型内存占用 | CPU(空闲) |
|---|---|---|---|
| 极简 API | 256 MB | 100–180 MB | <1% |
| 普通 Web 服务 | 512 MB | 200–400 MB | 1%–5% |
| 复杂微服务 | 1 GB+ | 500 MB–1.5 GB | 视负载而定 |
💡 提示:使用
jstat,jconsole,VisualVM或Spring Boot Actuator + Prometheus监控实际资源使用情况最准确。
如果你提供具体项目结构(如是否连 DB、用了哪些组件),我可以给出更精确的评估。
云小栈