线程池遇到的问题

最近项目上遇到个问题,程序一启动,内存占用就持续往上升,导致使用一段时间,就越来越慢,看日志页找不到原因,仔细检查了下代码,发下问题。

原来是代码中为了提高数据处理效率,开启了大量的线程池hreadPoolExecutor,且最新加的几个,没有关闭,且是局部的线程池,导致每次接口被调用,就会开启线程池,导致内存飙升。不容易,终于找到了。

线程池开启写法:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 1,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());

newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升, 最终导致OOM。

解决方法:

一、关闭线程

//在任务执行完后,调用shutdown方法,将线程池中的空闲线程回收。该方法会使得keepAliveTime参数失效。
//关闭线程池
threadPool.shutdown();
//线程全部结束,在继续下一步
while (!threadPool.isTerminated()) {
}

二、将线程池放在全局,这样保存系统只开启一个,不会越开越多。

posted @ 2021-11-23 14:39  昊昋  阅读(123)  评论(0编辑  收藏  举报