我正在使用Spring,在RequestMap
方法中我有如下代码:
@RequestMap
public void someMethod() {
ThreadPoolExecutor executor = Executors.newFixedThreadPool(N);
executor.submit(new Runnable());
executor.submit(new Runnable());
}
然后,即使每个Runnable
应该在几秒钟内完成,我仍然会收到OOM错误。在分析堆转储后,我发现有数千个Thread
个对象。
然后我使用executor
将Executors.newCachedThreadPool
更改为singlton,此问题已修复。
据我所知,在返回的方法之后,没有对线程池的引用,所以它应该被垃圾收集,但事实是线程仍在堆上。为什么呢?
答案 0 :(得分:0)
是的,这会泄漏内存。 As it says in the documentation:
应关闭未使用的
ExecutorService
以允许回收其资源。
关闭执行程序(executor.shutdown()
),或重复使用它。