【问题标题】:Creating ThreadPoolExecutor in spring cause memory leak?在spring中创建ThreadPoolExecutor会导致内存泄漏?
【发布时间】:2018-04-10 17:10:30
【问题描述】:

我正在使用 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,这个问题就解决了。

据我了解,方法返回后,并没有对线程池的引用,所以应该是垃圾回收,但事实是线程还在堆上。为什么?

【问题讨论】:

  • 如果您想并行运行,请考虑使用 rxjava 之类的东西,这样您就不必自己处理线程/池。
  • 您可能需要为此查看 spring async。

标签: java spring multithreading


【解决方案1】:

是的,这会泄漏内存。 As it says in the documentation:

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

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

【讨论】:

  • 请求结束后,没有executor的引用,为什么线程和executor没有被垃圾回收?
  • 因为线程存在于您所在范围的常规垃圾回收生命周期之外。
  • @LucasHolt 你的意思是线程完成工作后会继续退出JVM?
  • @user6690200 不是普通线程,但池中的线程未完成。当他们完成一项任务后,他们会等待更多。
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 2013-05-12
  • 1970-01-01
  • 2021-03-23
  • 2021-09-25
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多