【问题标题】:How to 'kill' the threads from an executor?如何“杀死”执行者的线程?
【发布时间】:2012-12-13 22:01:36
【问题描述】:

我有一个 tomcat webapp,我在其中使用 java 执行器来执行一些可运行文件。

首先我从我的执行器实例中分配执行器服务,如下所示:

executorService = Executors.newFixedThreadPool(nThreads, new MyThreadFactory(threadFactoryName))

然后,我使用执行器服务启动任务:

executorService.execute(new MyRunnable);

然后,它似乎工作。但我的问题是,我正在追逐某种泄漏,在运行服务器一段时间后出现此错误:

Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderCorePoolSize(ThreadPoolExecutor.java:703)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:652)
at something.server.ThreadExecutor.execute(MyRunnable.java:91)

我在 tomcat 实例上使用了 java VisualVM 来跟踪线程分配。我看到当我调用“newFixedThreadPool”时,我看到了“nThreads”新线程。但是在他们的工作完成后,我看到线程的状态是“等待”。

这正常吗?我不相信,我知道可运行对象完成了他们的工作,但执行程序服务从不释放线程。我可以做些什么来释放它们,还是我完全超出了范围?

【问题讨论】:

  • 不确定,我说得对,但池确实意味着池对象(此处为线程)被重用。所以这很正常......对于OOM:您使用的是ThreadLocals吗?
  • 我认为关于 fixed ThreadPool 的全部内容是它始终具有相同数量的线程?在您的 ThreadFactory 中,您能否给线程一个特定的名称,然后如果它是来自该执行程序的线程变得疯狂,那么您可以给 Profile 吗?我猜他们不是,这是其他一些泄漏。
  • 您是在 32 位还是 64 位操作系统上运行?

标签: java multithreading memory-leaks


【解决方案1】:

我认为您正在为每个请求或类似的东西实例化一个新的ExecutorService

您应该只实例化一个ExecutorService,然后重复使用它,或者在完成提交任务后在服务上调用shutdown()shutdown 函数将等待任务完成,然后释放线程。

【讨论】:

    【解决方案2】:

    您正在实例化一个 固定 线程池。 ExecutorService 不会释放线程,直到您通过调用 ExecutorService.shutdown()ExecutorService.shutdownNow() 终止 ExecutorService 本身。

    【讨论】:

      【解决方案3】:

      这正常吗?我不相信,我知道可运行对象完成了他们的工作,但执行程序服务从不释放线程。

      是的,这很正常。实际上,这种行为是可取的,因为创建新线程是一项昂贵的操作。池线程(或至少“核心”池线程)将继续存在,直到执行器关闭。

      我可以做些什么来释放它们,还是我完全超出了范围?

      您应该能够将线程池配置为拥有更小的“核心”线程池和/或更短的 keepAlive 时间。详情请参考javadoc


      [M]y 的问题是,我正在寻找某种泄漏,在运行服务器一段时间后出现此错误:

      OOME 不一定表示存在泄漏。这可能表明您没有为尝试创建的线程数留下足够的非堆内存。 (或者换句话说,你的线程池太大了。)

      【讨论】:

        猜你喜欢
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2011-06-29
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        相关资源
        最近更新 更多