Java线程池任务结束后线程只增不减,是否属于内存泄漏问题?
线程池线程未复用原因说明
当前现象属于标准线程池的正常工作逻辑,和内存泄漏无关:
- 你配置的
corePoolSize为10,核心线程数未达到10之前,每提交一个新任务线程池都会优先创建新的核心线程,哪怕已有核心线程处于空闲状态,这个阶段不会触发线程复用逻辑。你当前日志里最高只出现Async-6,还没到核心线程数阈值,自然看不到旧线程编号被复用。 - 等核心线程数占满10之后,后续新提交的任务会先进入容量为10的等待队列,空闲的核心线程会主动从队列拉取任务执行,这时候你就能观测到
Async-1到Async-10的线程编号被重复使用。 - 核心线程默认是常驻内存不会被回收的,所以线程数涨到10之后就会稳定不再上升,不属于异常的缓存机制问题。
异常情况排查参考
如果后续线程数超过10还持续上涨,才需要排查两个问题:
- 是否每次提交任务都新建了线程池实例,而不是复用同一个全局单例的线程池
- 是否错误修改了线程池的
allowCoreThreadTimeOut参数,且核心线程超时时间设置过短,导致核心线程频繁销毁重建,出现线程号持续递增的情况
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

