【SpringBoot】Java高频面试题 - SpringBoot同时处理多少请求

Java高频面试题 - SpringBoot同时处理多少请求

一、核心标准答案

Spring Boot 本身不处理请求,不决定并发数。Spring Boot 的请求并发能力,完全由**内嵌 Web 服务器(默认 Tomcat)**的参数决定。

通用结论(SpringBoot 2.x / 3.x 默认配置)

默认情况下,SpringBoot 可同时处理的最大并发请求数为 200

二、三大核心参数详解(Tomcat 并发模型)

Tomcat 并发能力由三个核心参数共同控制,三者作用层级不同,层层限制请求流量。

1. server.tomcat.threads.max(核心瓶颈)

  • 默认值:200

  • 含义:Tomcat 工作线程池最大线程数

  • 核心作用真正决定同一时刻能处理的请求数量。Tomcat 一个线程同一时间只能处理一个请求,200个线程即最大同时处理200个请求。

2. server.tomcat.accept-count(等待队列)

  • 默认值:100

  • 含义:所有工作线程占满后,新请求的最大等待队列长度

  • 作用:线程池满载时,请求不直接拒绝,进入队列排队;队列满后,新请求直接拒绝(连接超时/503)。

3. server.tomcat.max-connections(最大连接数)

  • 默认值:8192(部分版本为10000)

  • 含义:服务器允许建立的最大 TCP 连接数

  • 作用:包含正在处理、队列等待、Keep-Alive 长连接,是全局连接上限,默认值极大,日常业务几乎不会触发该瓶颈

三、完整请求处理流程

新请求进入服务的完整校验链路:

  1. 校验总连接数:当前TCP连接数 > max-connections(8192) → 直接拒绝连接

  2. 获取工作线程:存在空闲线程 → 立即处理请求

  3. 线程池满载处理:200个线程全部忙碌

  4. 校验等待队列:队列未满(<100)→ 请求入队等待;队列已满 → 拒绝请求

  5. 线程复用:线程处理完请求后,从队列取出下一个请求继续处理

四、关键并发数值结论(面试必背)

  • 实时并发处理上限:200(由最大工作线程数决定)

  • 瞬时最大承载请求数:200 + 100 =300

  • 超300瞬时请求:多余请求直接被拒绝

  • max-connections(8192):宏观长连接限制,非业务并发瓶颈

五、并发参数自定义配置

application.properties 配置示例

# 调整Tomcat最大工作线程数(核心并发数) server.tomcat.threads.max=400 # 调整请求等待队列长度 server.tomcat.accept-count=200 # 调整最大TCP连接数(默认足够,按需微调) server.tomcat.max-connections=10000

六、调优核心注意事项(面试加分点)

1. 禁止盲目加大线程数

每个Java线程默认占用约1MB栈内存,线程过多会导致:内存占用飙升、CPU上下文切换频繁、系统吞吐量下降,反而引发性能卡顿。

2. 按业务类型精准调优

  • CPU密集型(计算、加密、逻辑运算):线程数不宜过多,最优值接近CPU核心数,避免CPU抢占切换。

  • I/O密集型(DB查询、接口调用、文件读写):线程大量时间阻塞等待,可适当放大线程数提升并发。

3. 终极优化方案:异步非阻塞

针对I/O密集型业务,调高线程数是治标不治本,推荐两种方案彻底提升并发:

  • 使用@Async异步线程池处理业务

  • 使用Spring WebFlux响应式编程,少量线程支撑数万并发

4. 切换内嵌服务器

SpringBoot默认Tomcat,可替换为Undertow/Jetty,两者线程模型更轻量、并发性能更高,适合高并发场景。

七、满分面试答题话术(直接背诵)

SpringBoot 本身不处理请求,并发能力由内嵌的 Tomcat 服务器决定。默认配置下,SpringBoot 同时可处理200个并发请求

核心由三个参数控制:第一,max-threads默认200,是真正的实时并发上限;第二,accept-count默认100,是线程满载后的请求等待队列;第三,max-connections默认8192,是全局TCP连接上限。

所以服务瞬时最大可承载300个请求,超出会被拒绝。实际调优不能盲目加大线程数,需要区分CPU密集和I/O密集业务。高并发I/O场景,相比调线程数,使用异步非阻塞编程或替换Undertow服务器,性能提升更明显。