Java 在spring中创建ThreadPoolExecutor会导致内存泄漏吗?
我正在使用Spring,在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都应该在几
RequestMap
方法中,我有如下代码:
@RequestMap
public void someMethod() {
ThreadPoolExecutor executor = Executors.newFixedThreadPool(N);
executor.submit(new Runnable());
executor.submit(new Runnable());
}
然后我保持get OOM错误,即使每个Runnable
都应该在几秒钟内完成。在分析堆转储之后,我发现有数千个Thread
对象
然后我将executor
更改为singlton withExecutors.newCachedThreadPool
,这个问题得到了解决
据我所知,在方法返回后,没有对线程池的引用,因此应该对其进行垃圾收集,但事实上线程仍然在堆上。为什么?是的,这会泄漏内存: 应关闭未使用的
ExecutorService
,以允许回收其资源
关闭executor(),或重新使用它。请求完成后,没有对
executor的引用,为什么线程和执行器没有被垃圾收集?因为线程生活在您所在作用域的常规垃圾收集生命周期之外。@LucasHolt您的意思是线程在完成任务后将继续存在于JVM中?@user6690200不是普通线程,但池中的线程不会完成。当他们完成一项任务后,他们会等待更多。如果你想并行运行,考虑使用像RXJava这样的东西,这样你就不必自己处理线程/池。