Java executor を使用していくつかのランナブルを実行する tomcat webapp があります。
まず、次のように、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」の新しいスレッドが表示されます。しかし、彼らの仕事が終わった後、スレッドの状態が「待機中」になっていることがわかります。
それは正常ですか?ランナブルが仕事を終えることは知っていますが、エグゼキューターサービスはスレッドを決して解放しません。それらを解放するにはどうすればよいですか、それとも完全に範囲外ですか?