一、Executors 返回的线程池对象的弊端:
- FixedThreadPool和 SingleThreadPool: 允许的请队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
- CachedThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
- ScheduledThreadPool:允许的创建线程数量为 nteger.MAX VALUE,但实际不会无限创建线程。导致OOM的主要原因是构造ScheduledThreadPool时使用的队列为:DelayedWorkQueue,每次往队列添加任务时调用:put()-->offer() --> grow()。grow()方法是队列扩容,最大长度为Integer.MAX_VALUE
二、使用@Async时,一定要指定自定义线程池名称。
如:@Async("threadPoolExecutor")
说明:
Springboot默认使用的是ThreadPoolTaskExecutor(参考:TaskExecutionAutoConfiguration),默认最大线程数和队列最大值均为Integer.MAX_VALUE,可能会导致oom