背景描述
公司里面有一个部门产生的故障,故障问题是服务器oom,导致服务不可用。最终排查到的原因是有一个方法,在内部创建了线程池。每次调用该方法都会创建一个线程池,从而导致了oom。
问题分析
抛砖引玉,先思考一下问题
这个oom是由于什么原因造成的呢?是常规的堆内存溢出导致的oom吗?创建的线程池对象,会被gc回收吗?
源码分析
在使用线程池运行任务的时候,做了哪些事情
// 核心运行运行的代码为addWorker() ++++++++++++++++++++
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
// work 构造器
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
// 传入的任务为firstTask对象 ++++++++++++++++++++
this.firstTask = firstTask;
// 此处将work对象放入到线程中 &#