Java Spring Boot应用线程数未变化及Tomcat线程池疑问
问题解答
一、为什么创建50个自定义Thread后,jconsole显示线程数始终保持32?
- 线程快速执行完毕并销毁:如果你的自定义Thread的
run()方法没有执行耗时逻辑(比如只是空方法或简单计算),线程启动后会立刻完成任务,随后被JVM销毁。jconsole显示的是当前存活的线程数,而非你创建过的总线程数。这32个线程主要是Spring Boot应用的核心线程:包括主线程、GC相关线程、Tomcat的核心线程、Spring上下文管理线程等,你的自定义线程执行完就消失了,所以存活数不会涨到50。 - 验证方式:可以在
run()方法里添加Thread.sleep(30000)(让线程休眠30秒),再用jconsole查看,此时存活线程数会明显增加(接近50+核心线程数)。
二、为什么Spring Boot嵌入式Tomcat默认线程池大小200,但实际线程数远低于200?
Tomcat的线程池是按需动态创建的,不是启动就初始化200个线程:
- 核心线程与最大线程的区别:嵌入式Tomcat默认的
coreThreads(核心线程数)是10,maxThreads(最大线程数)是200。核心线程是Tomcat会维持的最小存活线程数,只有当请求量超过核心线程的处理能力时,才会逐步创建新线程,直到达到maxThreads的上限。 - 空闲线程回收机制:即使是核心线程,如果长时间空闲(默认
keepAliveTime为60秒),也会被Tomcat销毁,直到线程数降到minSpareThreads(默认等于核心线程数)。在没有请求的情况下,Tomcat的线程池里只会有少量核心线程,不会出现200个线程。 - 验证方式:可以用压测工具(比如Apache Bench)给你的Spring Boot应用发送大量请求,此时再用jconsole查看,线程数会逐步上升,直到接近200(如果请求量足够大)。
补充:你可以通过配置项修改Tomcat线程池参数,在
application.properties中设置:server.tomcat.threads.core=20 server.tomcat.threads.max=200
内容的提问来源于stack exchange,提问作者Patrick Starfish
相关产品推荐
相关产品推荐

