ThreadPool和内部类的内存泄露
2024-01-10 22:38:40 822
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
方法