线程池遇到的问题
最近项目上遇到个问题,程序一启动,内存占用就持续往上升,导致使用一段时间,就越来越慢,看日志页找不到原因,仔细检查了下代码,发下问题。
原来是代码中为了提高数据处理效率,开启了大量的线程池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()) {
}
二、将线程池放在全局,这样保存系统只开启一个,不会越开越多。
本文来自博客园,作者:昊昋,转载请注明原文链接:https://www.cnblogs.com/hbaook-geui/p/15593121.html