SpringBoot项目内存占用分析
结论:一个简单的SpringBoot项目启动后内存占用通常在100MB-300MB之间,具体取决于依赖组件、JVM配置和运行环境。
内存占用主要组成部分
-
JVM基础开销:约50-100MB
- 包括JVM自身运行所需内存
- 类加载和元数据空间占用
-
Spring框架核心:约30-50MB
- IOC容器
- AOP支持
- 自动配置机制
-
内嵌服务器:Tomcat/Undertow/Jetty约20-50MB
- Tomcat默认占用较多,Jetty相对轻量
-
依赖库:视引入starter情况而定
- 每个额外starter可能增加5-20MB
- 例如Spring Web增加约15MB
影响因素
启动参数影响显著
-Xms
(初始堆大小)和-Xmx
(最大堆大小)设置- 默认通常为物理内存的1/64和1/4
依赖组件差异
- 引入数据库连接池(如HikariCP)增加约10MB
- 引入Spring Security增加约15-20MB
- Actuator监控组件增加约10MB
环境差异
- IDE中运行(如IntelliJ)通常比生产环境多占用20-30MB
- Linux系统通常比Windows节省10-20MB内存
优化建议
关键优化点:合理设置JVM参数和精简依赖
- 对于简单项目可尝试配置:
-Xms64m -Xmx128m
- 使用
spring-boot-starter-webflux
替代spring-boot-starter-web
可节省约10-15MB - 排除不必要的自动配置:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
实际测量示例
基础SpringBoot 2.7.x项目
- 仅含Web依赖
- 默认JVM参数
- Linux环境下:
- 启动后RSS内存:约180MB
- JVM堆内存:约80MB(使用VisualVM监控)
添加常用依赖后
- +Spring Data JPA:增加约25MB
- +H2数据库:增加约15MB
- 总内存:约220MB
总结
SpringBoot的"简单"项目内存占用主要取决于您对"简单"的定义。通过合理配置和依赖管理,完全可以将内存控制在150MB以下;而由于业务复杂度增加,300-500MB也属正常范围。对于内存敏感场景,建议使用GraalVM Native Image技术,可将内存降至50MB以下。