Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何';杀死';执行者的线程?_Java_Multithreading_Memory Leaks - Fatal编程技术网

Java 如何';杀死';执行者的线程?

Java 如何';杀死';执行者的线程?,java,multithreading,memory-leaks,Java,Multithreading,Memory Leaks,我有一个tomcatwebapp,在这里我使用java执行器来执行一些runnable 首先,我从我的executor实例中分配executor服务,如下所示: executorService = Executors.newFixedThreadPool(nThreads, new MyThreadFactory(threadFactoryName)) 然后,我使用executor服务启动任务: executorService.execute(new MyRunnable); 然后,它似乎起

我有一个tomcatwebapp,在这里我使用java执行器来执行一些runnable

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

executorService = Executors.newFixedThreadPool(nThreads, new MyThreadFactory(threadFactoryName))
然后,我使用executor服务启动任务:

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'新线程。但是在他们的工作完成之后,我看到线程的状态是“等待”

这正常吗?我不相信,我知道Runnable完成了他们的工作,但executor服务从未释放线程。我能做些什么来释放他们,还是我完全超出了范围

这正常吗?我不相信,我知道Runnable完成了他们的工作,但executor服务从未释放线程

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

我能做些什么来释放他们,还是我完全超出了范围

您应该能够将线程池配置为具有较小的“核心”线程池和/或较小的保留时间。有关详细信息,请参阅


[M] 问题是,我正在追踪某种泄漏,在运行服务器一段时间后,我出现了以下错误:

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)

那个渗出物不一定是泄漏的迹象。这可能表明您没有为尝试创建的线程数量留下足够的非堆内存。(或者换句话说,你的线程池太大了。)

你正在实例化一个固定的线程池。
ExecutorService
不会释放线程,除非您通过调用
ExecutorService.shutdown()
ExecutorService.shutdownNow()

来终止
ExecutorService
本身,我想您是在为每个请求实例化一个新的
ExecutorService
,或者类似的东西


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

不确定,我没有搞错,但池实际上意味着池对象(此处为线程)被重用。所以这很正常。。。对于OOM:您使用的是ThreadLocals吗?我认为关于固定线程池的全部内容是它始终具有相同数量的线程?在您的ThreadFactory中,您是否可以为线程指定一个特定的名称,然后对该执行器中的线程进行配置?我想他们不是,这是另一个漏洞。你是在32位还是64位操作系统上运行?