Spring Boot 2/3/4 并发内存对比测试报告
项目简介
两个功能完全相同的员工管理系统,分别基于 Spring Boot 4(Java 21)和 Spring Boot 3(Java 8),用于对比打包 JAR 容量差异,验证 Spring Boot 4 模块化重构带来的瘦身效果。
功能列表
| 功能 | 说明 |
|---|
| 部门 CRUD | 新增/修改/删除/查询部门,分页列表 |
| 员工 CRUD | 新增/修改/删除/查询员工,分页列表 |
| 员工搜索 | 按部门筛选、姓名模糊搜索 |
| 统一响应 | ApiResponse 封装(code/message/data) |
| 全局异常处理 | @RestControllerAdvice |
| 参数校验 | Bean Validation(@NotBlank/@Size/@Email) |
| 数据库初始化 | schema.sql 建表 + data.sql 初始数据 |
| 健康检查 | Spring Boot Actuator(health/info) |
快速开始
前置条件
- JDK 21(springboot4 项目)
- JDK 17(springboot3 项目)
- JDK 1.8(springboot2 项目)
- MySQL 8.4 运行在 127.0.0.1:13308
- Maven 3.6+
创建数据库
CREATE DATABASE employee_db DEFAULT CHARACTER SET utf8mb4;
CREATE DATABASE employee_db3 DEFAULT CHARACTER SET utf8mb4;
API 接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/departments?page=0&size=10 | 部门分页列表 |
| GET | /api/departments/{id} | 部门详情 |
| POST | /api/departments | 新增部门 |
| PUT | /api/departments/{id} | 修改部门 |
| DELETE | /api/departments/{id} | 删除部门 |
| GET | /api/employees?departmentId=1&name=张&page=0&size=10 | 员工分页/搜索 |
| GET | /api/employees/{id} | 员工详情 |
| POST | /api/employees | 新增员工 |
| PUT | /api/employees/{id} | 修改员工 |
| DELETE | /api/employees/{id} | 删除员工 |
| GET | /actuator/health | 健康检查 |
| GET | /actuator/info | 应用信息 |
测试环境
- 测试时间: 2026-05-05
- 操作系统: macOS (Darwin)
- 测试工具: Apache Bench (ab)
- 数据库: H2 内存数据库
测试配置
| 配置项 | 值 |
|---|
| 并发数 | 20 |
| 总请求数 | 200 |
| 预热请求数 | 50 |
| 测试端点 | /api/departments?page=0&size=10 |
应用配置
| 应用 | Spring Boot 版本 | Java 版本 | 虚拟线程 |
|---|
| springboot2 | 2.7.18 | 1.8 | 不支持 |
| springboot3 | 3.4.1 | 17 | 不支持 |
| springboot4 | 4.0.0 | 21 | 已启用 |
测试结果
内存对比
| 应用 | 启动内存 (MB) | 负载后内存 (MB) | 内存增长 (MB) | 增长率 |
|---|
| springboot2 | 958.3 | 976.2 | +17.9 | +1.9% |
| springboot3 | 414.5 | 454.3 | +39.8 | +9.6% |
| springboot4 | 365.6 | 374.9 | +9.3 | +2.5% |
性能对比
| 应用 | RPS (每秒请求数) | 平均响应时间 (ms) | 失败请求数 |
|---|
| springboot2 | 149.67 | 133.632 | 0 |
| springboot3 | 1862.02 | 10.741 | 0 |
| springboot4 | 1494.95 | 13.378 | 0 |
关键发现
1. 内存占用
- Spring Boot 4 内存最优:启动内存仅 365.6 MB,比 Spring Boot 3 低 12%,比 Spring Boot 2 低 62%
- 内存增长最小:并发测试后内存增长仅 9.3 MB,远低于 Spring Boot 3 的 39.8 MB
- 虚拟线程效果显著:Spring Boot 4 启用虚拟线程后,内存管理更高效
2. 性能表现
- Spring Boot 3 RPS 最高:1862.02 req/s
- Spring Boot 4 RPS 次之:1494.95 req/s
- Spring Boot 2 RPS 最低:149.67 req/s
3. 虚拟线程优势
Spring Boot 4 启用了虚拟线程(Virtual Threads),带来以下优势:
- 更低的内存占用:虚拟线程比平台线程更轻量
- 更好的并发处理:在高并发场景下内存增长更小
- 更高效的资源利用:减少线程上下文切换开销
技术细节
Spring Boot 4 虚拟线程配置
spring:
threads:
virtual:
enabled: true
测试方法
- 分别启动三个应用(使用 H2 内存数据库)
- 使用 ab 进行并发压力测试
- 监控 JVM 内存使用(RSS)
- 对比启动后和负载后的内存差异
结论
- Spring Boot 4 在内存方面表现最优,特别是在并发场景下
- 虚拟线程是关键优势,显著降低了内存增长
- Spring Boot 3 性能最好,但内存增长较大
- Spring Boot 2 内存占用最高,性能最差
建议
- 新项目推荐使用 Spring Boot 4:内存效率高,支持虚拟线程
- 高并发场景优先考虑 Spring Boot 4:虚拟线程能有效降低资源消耗
- 性能敏感场景可考虑 Spring Boot 3:RPS 最高,但需注意内存增长
测试文件
- 仓库:https://github.com/gzdzh-cn/springboot-test
- 测试脚本:
concurrent-memory-test.sh - 详细日志:
test-results/ - AB测试结果:
test-results/*_ab.txt