我有一个 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”新线程。但是在他们的工作完成后,我看到线程的状态是“等待”。
这正常吗?我不相信,我知道可运行对象完成了他们的工作,但执行程序服务从不释放线程。我能做些什么来释放它们,还是我完全超出了范围?