小编典典

在春季创建ThreadPoolExecutor会导致内存泄漏?

java

我正在使用Spring,在一种RequestMap方法中,我的代码如下:

@RequestMap
public void someMethod() {
    ThreadPoolExecutor executor = Executors.newFixedThreadPool(N);
    executor.submit(new Runnable());
    executor.submit(new Runnable());
}

然后,即使每秒钟都Runnable应该完成,我仍然会收到OOM错误。分析堆转储后,我发现有数千个Thread对象。

然后我改为executor,使用singlton Executors.newCachedThreadPool,此问题已解决。

据我了解,该方法返回后,没有对线程池的引用,因此应该对其进行垃圾回收,但事实是线程仍在堆上。为什么?


阅读 353

收藏
2020-11-30

共1个答案

小编典典

是的,这会泄漏内存。如文档中所述

ExecutorService应该关闭未使用的资源,以回收其资源。

关闭执行程序(executor.shutdown()),或重新使用它。

2020-11-30