Java 在spring中创建ThreadPoolExecutor会导致内存泄漏吗?

Java 在spring中创建ThreadPoolExecutor会导致内存泄漏吗?,java,spring,multithreading,Java,Spring,Multithreading,我正在使用Spring,在RequestMap方法中,我有如下代码: @RequestMap public void someMethod() { ThreadPoolExecutor executor = Executors.newFixedThreadPool(N); executor.submit(new Runnable()); executor.submit(new Runnable()); } 然后我保持get OOM错误,即使每个Runnable都应该在几

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

@RequestMap
public void someMethod() {
    ThreadPoolExecutor executor = Executors.newFixedThreadPool(N);
    executor.submit(new Runnable());
    executor.submit(new Runnable());
}
然后我保持get OOM错误,即使每个
Runnable
都应该在几秒钟内完成。在分析堆转储之后,我发现有数千个
Thread
对象

然后我将
executor
更改为singlton with
Executors.newCachedThreadPool
,这个问题得到了解决


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

是的,这会泄漏内存:

应关闭未使用的
ExecutorService
,以允许回收其资源


关闭executor(),或重新使用它。

请求完成后,没有对
executor的引用,为什么线程和执行器没有被垃圾收集?因为线程生活在您所在作用域的常规垃圾收集生命周期之外。@LucasHolt您的意思是线程在完成任务后将继续存在于JVM中?@user6690200不是普通线程,但池中的线程不会完成。当他们完成一项任务后,他们会等待更多。如果你想并行运行,考虑使用像RXJava这样的东西,这样你就不必自己处理线程/池。