| 失效链接处理 |
|
Spring为什么不建议使用默认线程池?
相关截图:
![]() 主要内容:
一、先搞清楚:Spring里的“默认线程池”指什么
在 Spring 项目里,大家说的“默认线程池”,通常有两类:
@Async 没指定执行器时Spring 会落到 SimpleAsyncTaskExecutor:来一个任务,就新建一个线程,用完就丢,几乎不做复用。
JDK 的 Executors 工厂方法比如 Executors.newFixedThreadPool(n)、newCachedThreadPool()。看起来方便,但队列或线程数往往是“无限”的,埋了隐患。
这两种都能“先跑起来”,但生产环境风险都偏大。
二、默认线程池到底有什么坑
1. 线程创建太猛,机器扛不住
SimpleAsyncTaskExecutor 不复用线程。流量一上来,线程越开越多:
上下文切换变多,CPU 空转
每个线程都占栈内存,堆外压力跟着涨
极端情况下直接把机器打挂
2. 队列无限膨胀,容易 OOM
Executors.newFixedThreadPool(10) 内部用的是无界队列(LinkedBlockingQueue 不设容量)。核心线程忙不过来时,任务会一直往队列里塞,内存一点点被吃光,最后可能直接 OutOfMemoryError。
|


苏公网安备 32061202001004号
