在 2核2GB(2C2G)的服务器上,一个空的、未做任何优化的默认 Spring Boot 应用(基于 Spring Boot 3.x + JDK 17+,打包为 jar 运行),其典型系统资源占用如下(实测与生产经验综合):
✅ 内存(RAM)占用(关键指标)
| 场景 | JVM 堆内存(-Xmx) | 实际 RSS 内存占用 | 说明 |
|---|---|---|---|
| 最小启动(无参数,JDK 默认配置) | ~256MB(JDK 自动设置) | ~350–450 MB | 启动后立即观察 ps aux --sort=-%mem 或 pmap -x <pid>;含堆、元空间、线程栈、JIT 代码缓存、本地内存(Netty/IO 等) |
合理配置(推荐)-Xms256m -Xmx256m -XX:MetaspaceSize=128m |
256MB heap + 128MB metaspace | ~320–400 MB | 更稳定,避免动态扩容开销;适合轻量服务 |
| 极简优化(GraalVM Native Image) | —(无 JVM) | ~60–120 MB | 静态编译,冷启动快,内存极低,但构建复杂、不支持所有反射/动态X_X |
🔍 实测参考(Spring Boot 3.2 + JDK 17.0.2,OpenJDK):
$ ps -o pid,rss,comm -p $(pgrep -f 'ApplicationKt') PID RSS COMMAND 12345 382192 java # ≈ 373 MB RSS
✅ CPU 占用
- 空闲状态(无请求、无定时任务):
- 持续 CPU 使用率:0.1% ~ 0.5%(主要是 GC 线程、心跳、Spring Scheduler 空轮询等)
- 短时峰值(如首次类加载、JIT 编译):≤ 100% 单核(约 0.5s),可忽略
- 简单 HTTP 请求(如
/actuator/health):单次响应 ≈ 2–5ms,CPU 消耗微乎其微
✅ 其他资源
| 资源 | 占用情况 | 备注 |
|---|---|---|
| 磁盘空间 | ~15–50 MB | JAR 包(含嵌入式 Tomcat/Jetty)+ 日志(logback 默认滚动) |
| 文件描述符(FD) | ~50–100 个 | Tomcat 默认监听 8080、AJP(若启用)、JMX、日志文件等 |
| 线程数(JVM) | ~25–40 个 | 主线程、GC、Tomcat 线程池(默认 200 max,但空闲仅保留 10)、定时调度、Actuator 端点等 |
⚠️ 关键注意事项(2C2G 下易踩坑!)
-
不要裸跑,默认配置会吃光内存!
JDK 17+ 在容器/小内存环境不再自动适配堆大小(需显式设-Xmx),否则可能默认分配 1–2GB 堆 → OOM Killer 杀进程。 -
Tomcat 默认连接池过大:
# application.yml 推荐调优(2C2G 场景) server: tomcat: max-connections: 100 # 降低最大连接数 accept-count: 20 # 队列长度 max-threads: 20 # 核心线程数 ≈ 2×CPU cores min-spare-threads: 5 -
禁用非必要功能(显著降内存):
management: endpoints: web: exposure: include: "health,info" # 关闭 env, beans, metrics 等(尤其避免暴露 /actuator/env) spring: main: banner-mode: off # 关闭启动 Banner(省 100KB+) output: ansi: console-available: false # 禁用 ANSI(终端无关) -
选择轻量 Web 容器(可再省 30–50MB):
<!-- pom.xml 移除 tomcat,改用 undertow --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
✅ 总结:2C2G 上的可行方案
| 场景 | 推荐配置 | 预期内存 | 是否可行 |
|---|---|---|---|
| ✅ 单应用 + 基础 API + 少量并发(<100 QPS) | -Xms256m -Xmx256m -XX:MetaspaceSize=128m + Undertow + 精简 Actuator |
~330 MB RSS | ✔️ 安全(剩余 ~1.6GB 给 OS/其他进程) |
| ⚠️ 同时跑 MySQL + Redis + Spring Boot | ❌ 不推荐 | 内存严重不足(MySQL 最小需 512MB+) | × 建议拆服务或升级配置 |
| ✅ 多个轻量 Spring Boot 微服务(如 3–4 个) | 每个 -Xmx128m + Quarkus/Spring Native |
每个 ~100–150 MB | ✔️ 可行(需 careful 资源隔离) |
如需进一步优化(如压测数据、GC 日志分析、Docker 内存限制配置),欢迎提供具体场景(如是否用 MyBatis、Redis、消息队列等),我可以给出针对性建议。
CLOUD云枢