在2核2G(2 CPU核心,2GB内存)的服务器上部署 Spring Boot 应用时,由于资源有限,必须进行合理的性能优化和配置调整,以确保应用稳定运行、响应及时。以下是关键的优化建议:
一、JVM 调优(最关键)
1. 合理设置 JVM 堆内存
- 默认情况下,JVM 可能分配过多堆内存,导致频繁 GC 或 OOM。
- 建议设置:
-Xms512m -Xmx1024m-Xms512m:初始堆大小设为 512MB,避免频繁扩容。-Xmx1024m:最大堆大小不超过 1GB,留出内存给操作系统、元空间、线程栈等。
2. 使用合适的垃圾回收器(GC)
- 推荐使用 G1GC(平衡吞吐量与延迟):
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 - 避免使用 CMS(已弃用)或 Parallel GC(停顿时间较长)。
3. 元空间(Metaspace)调优
- 限制元空间大小,防止内存溢出:
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
4. 禁用不必要的 JVM 特性
-XX:+DisableExplicitGC # 禁止 System.gc() 触发 Full GC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dumps
二、Spring Boot 应用优化
1. 关闭不必要的自动配置
- 在
application.yml中禁用非必需模块:spring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration - org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration - 按需引入 starter,避免加载无用 Bean。
2. 减少启动时扫描范围
- 显式指定主类包路径,避免全盘扫描:
@SpringBootApplication(scanBasePackages = "com.example.app")
3. 使用轻量级内嵌服务器
- 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> </exclusion> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
三、数据库连接池调优
使用 HikariCP(默认推荐),合理配置连接数
spring:
datasource:
hikari:
maximum-pool-size: 10 # 2核建议 8~10
minimum-idle: 2
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
- 连接数不宜过高(一般 ≤ 核心数 × (1~2)),避免线程争抢。
四、缓存与静态资源处理
1. 启用缓存(如 Redis / Caffeine)
- 减少数据库压力,提升响应速度。
- 若本地内存紧张,优先使用外部 Redis。
2. 静态资源交给 Nginx 托管
- 将 JS/CSS/图片等交给 Nginx 处理,减轻 Spring Boot 负担。
- 配置 gzip 压缩和缓存头。
五、监控与日志优化
1. 日志级别调为 WARN 或 ERROR
logging:
level:
root: WARN
com.example: INFO
- 避免 DEBUG 日志大量输出,消耗 I/O 和 CPU。
2. 异步日志(可选)
- 使用 Logback + AsyncAppender 提高性能。
3. 监控(谨慎使用)
- Actuator 会占用资源,建议关闭非必要端点:
management: endpoints: enabled-by-default: false endpoint: health: enabled: true metrics: enabled: false
六、系统层面优化
1. 确保 swap 分区存在
- 防止 OOM kill,但不要依赖 swap 性能。
2. 限制其他进程资源占用
- 关闭无关服务(如邮件、cron 等),释放资源。
3. 使用反向(Nginx)
- 实现负载均衡、SSL 终止、静态资源缓存等。
七、代码层面优化建议
- 避免大对象创建、内存泄漏。
- 使用流式处理大数据集(如分页查询)。
- 避免同步阻塞操作(如远程调用未超时)。
- 合理使用线程池,避免
new Thread()。
八、部署方式建议
- 使用 JAR 包 + 内嵌服务器,减少外部依赖。
- 避免使用 WAR + 外部 Tomcat(额外开销)。
- 使用
nohup或 systemd 守护进程运行。
示例启动命令:
nohup java -Xms512m -Xmx1024m -XX:+UseG1GC
-jar myapp.jar --spring.profiles.active=prod > app.log 2>&1 &
总结:关键配置参考
| 项目 | 推荐值 |
|---|---|
| JVM 堆内存 | -Xms512m -Xmx1024m |
| GC 算法 | G1GC |
| 数据库连接池最大连接数 | 8~10 |
| 日志级别 | WARN 或 INFO(按需) |
| 内嵌服务器 | Undertow 或 Tomcat |
| 静态资源 | Nginx 托管 |
| Spring Boot 自动配置 | 按需排除 |
通过以上优化,可以在 2核2G 的服务器上稳定运行中小型 Spring Boot 应用。若并发较高,建议升级硬件或横向扩展。
CLOUD技术笔记