在2G内存服务器上部署Spring Boot应用需要精细优化。以下是最佳实践:
一、应用层面优化
1. 依赖精简
<!-- 移除不必要的starter -->
<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>
<!-- 使用undertow替代tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
2. JVM参数优化
# 针对2G内存的推荐配置
java -Xms512m -Xmx1024m
-XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+UseStringDeduplication
-jar your-app.jar
3. 应用配置优化
server:
undertow:
threads:
worker: 8 # 根据CPU核心数调整
io: 2
buffer-size: 1024
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
# 排除不需要的自动配置
二、运行时优化
1. 容器化部署(Docker)
FROM openjdk:11-jre-slim
COPY target/app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Xmx1024m", "-jar", "/app.jar"]
2. 使用Alpine基础镜像
FROM openjdk:11-jre-alpine
# 镜像大小仅约80MB
三、架构优化
1. 功能裁剪
- 移除Actuator非必要端点
- 禁用DevTools生产环境
- 使用轻量级JSON库(Jackson > Gson)
- 考虑使用Javalin或Micronaut替代Spring Boot
2. 数据库连接池优化
spring:
datasource:
hikari:
maximum-pool-size: 5 # 减少连接数
minimum-idle: 2
四、监控与调优
1. 内存分析工具
# 使用jcmd分析内存
jcmd <pid> GC.heap_info
jcmd <pid> VM.native_memory
2. 精简监控端点
@Configuration
public class ActuatorConfig {
@Bean
public EndpointFilter endpointFilter() {
return (endpoint) -> endpoint.getId().matches("health|info");
}
}
五、部署策略
1. 资源限制
# docker-compose.yml
services:
app:
deploy:
resources:
limits:
memory: 1.5G
reservations:
memory: 512M
2. 水平扩展
- 考虑部署多个小实例而非单个大实例
- 使用Nginx负载均衡
六、备选方案
如果内存仍然紧张,考虑:
- GraalVM Native Image – 启动快,内存占用低
- Quarkus/Micronaut – 专为低内存设计的框架
- 静态编译 – 使用Spring Native
关键指标监控
# 监控命令
free -h # 系统内存
top -p <pid> # 进程内存
jstat -gc <pid> 1000 # GC情况
通过以上优化,通常可以将Spring Boot应用内存占用控制在800MB-1.2GB范围内,为系统留出足够余量。
CLOUD技术笔记