在 Spring Boot 应用中配置服务器(如 Tomcat、Undertow 或 Jetty)的内存和 CPU 资源通常涉及以下几个方面:
1. JVM 内存配置
通过 JVM 参数调整堆内存和非堆内存:
java -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -jar your-app.jar
-Xms:初始堆内存(如512m)。-Xmx:最大堆内存(如1024m)。-XX:MaxMetaspaceSize:元空间(Metaspace)大小(Java 8+)。
推荐:生产环境建议 -Xms 和 -Xmx 设为相同值,避免动态调整开销。
2. 嵌入式服务器线程配置
Spring Boot 默认使用嵌入式服务器(如 Tomcat),可在 application.properties/application.yml 中配置:
Tomcat 配置
# 线程池配置
server.tomcat.threads.max=200
server.tomcat.threads.min-spare=10
# 连接器配置(NIO模式)
server.tomcat.max-connections=10000
server.tomcat.accept-count=100
# 请求头大小等
server.max-http-header-size=8KB
Undertow 配置
# 工作线程数
server.undertow.threads.worker=200
server.undertow.threads.io=4
# 缓冲区大小
server.undertow.buffer-size=1024
3. CPU 资源利用
- 线程池大小:根据 CPU 核心数调整(通常
线程数 = CPU核心数 * 2)。@Bean public Executor taskExecutor() { int cores = Runtime.getRuntime().availableProcessors(); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(cores); executor.setMaxPoolSize(cores * 2); return executor; } - 异步处理:使用
@Async或 Reactive 编程(如 WebFlux)提高 CPU 利用率。
4. 容器化部署(Docker/K8s)
在容器中需显式限制资源:
# Dockerfile 示例
FROM openjdk:17-jdk
COPY target/app.jar /app.jar
ENTRYPOINT ["java", "-Xmx1g", "-Xms1g", "-jar", "/app.jar"]
通过 docker run 或 Kubernetes 资源限制:
docker run --cpus=2 --memory=2g my-spring-app
K8s 示例:
resources:
limits:
cpu: "2"
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi"
5. 监控与调优
- 监控工具:
- JVM:VisualVM、JConsole、Prometheus + Micrometer。
- 系统:Grafana + Prometheus。
- GC 调优:根据场景选择垃圾收集器(如 G1、ZGC)。
最佳实践建议
- 测试:通过压测(JMeter/Gatling)确定最优配置。
- 渐进调整:从小参数开始,逐步增加,观察性能变化。
- 云环境:利用云平台自动伸缩(如 AWS Auto Scaling、K8s HPA)。
根据应用的实际负载和业务需求灵活调整配置!
云服务器