ThreadPool和内部类的内存泄露

kyaa111 3月前 ⋅ 376 阅读
private void getItemInfo(String site) {
    // ...
    ExecutorService pool = Executors.newSingleThreadExecutor();
    pool.submit(task);
}

getItemInfo方法结束后, pool对象不会回收

因为pool内还有线程在waiting状态, 在GC root上, pool是可达的. (Thread可以作为 GC Root)

在这里, 线程包装为了Worker对象, Worker实际是ThreadPoolExecutor的内部类, 内部类(区别于静态内部类)会持有一个ThreadPoolExecutor的引用. 所以方法退出后, GC root仍然可达.

解决方法就是调用线程池的shutdown方法