一个 Spring Boot 项目代码量极少却占用大量内存 的情况,是很多开发者在使用 Spring Boot 时经常遇到的问题。尽管你的代码量很少,但 Spring Boot 本身是一个功能丰富、依赖较多的框架,它在运行时会加载很多自动配置、内嵌的 Web 容器(如 Tomcat)、Spring 上下文、第三方库等,这些都会占用内存。
📌 一、为什么代码量少但内存占用高?
1. Spring Boot 的自动配置机制
Spring Boot 会根据你引入的依赖(如 spring-boot-starter-web)自动加载大量配置类(Configuration),即使你没有使用到这些功能,它们也会被初始化和加载到内存中。
2. JVM 启动参数默认值较高
Spring Boot 默认使用的是 JVM 的 server 模式,并且会根据系统资源自动设置堆内存大小。例如:
-Xms(初始堆大小)可能默认是几百 MB-Xmx(最大堆大小)可能高达 1~2GB 或更高
即使没有太多代码,JVM 也会为运行预留这么多内存。
3. 内嵌 Web 容器(如 Tomcat)
Spring Boot 默认使用内嵌的 Tomcat、Jetty 等服务器,这些容器本身也会占用一定内存,包括线程池、连接池、缓存等。
4. Spring 上下文的初始化
Spring 容器启动时会扫描、加载、实例化、初始化 Bean,这些操作会占用较多内存,尤其是自动注入、AOP、等机制。
5. 日志框架、监控、健康检查等
Spring Boot 默认引入了日志框架(如 Logback)、Actuator(监控)、Spring Boot DevTools(开发工具)等,这些都会增加内存使用。
📌 二、如何降低 Spring Boot 项目的内存占用?
✅ 1. 优化 JVM 参数
在启动时通过命令行设置 JVM 参数来限制内存使用:
java -Xms64m -Xmx128m -jar your-app.jar
这样可以限制 JVM 初始堆大小为 64MB,最大为 128MB。
✅ 2. 移除不必要的依赖
检查 pom.xml 或 build.gradle,移除不需要的 starter:
例如:
<!-- 移除不需要的模块 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
或者改用更轻量的容器(如 Undertow)。
✅ 3. 使用 Spring Boot 的精简模式
- 使用
spring-context-indexer来加快启动 - 使用
spring.main.lazy-initialization=true延迟加载 Bean
在 application.properties 中添加:
spring.main.lazy-initialization=true
✅ 4. 关闭 Actuator、DevTools、JMX 等
如果你不需要这些功能,可以将其从依赖中移除:
<!-- 删除 devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
✅ 5. 使用 GraalVM Native Image(进阶)
如果你希望极致优化内存和启动速度,可以尝试将 Spring Boot 应用编译为原生镜像(Native Image)。
📌 三、示例:最小 Spring Boot 应用的内存使用
一个最简单的 Spring Boot 项目(只暴露一个 /hello 接口),默认运行时内存占用通常在 200MB~300MB 左右。通过优化后可以降到 80MB~120MB。
✅ 总结
| 原因 | 解决方案 |
|---|---|
| 自动配置加载太多 | 移除不必要的依赖、排除自动配置 |
| JVM 默认内存高 | 设置 -Xms 和 -Xmx |
| 内嵌容器占用 | 换成 Undertow 或外部部署 |
| Bean 初始化多 | 启用懒加载 |
| 附加功能多 | 移除 Actuator、DevTools 等 |
如果你愿意,我可以帮你分析你的 pom.xml 或 build.gradle,看看有没有可以优化的地方。欢迎贴出来 😊
是否需要我给你一个最小 Spring Boot 项目模板?
CLOUD技术博