次のコードに示すように、プール サイズが 1 の SchedulerExecutorService を使用しています。
private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
そして、scheduleAtFixedRate メソッドを呼び出す
testConnectionHandle = scheduler.scheduleAtFixedRate(testConnection, DELAY, PERIOD, TimeUnit.SECONDS);
ここで、DELAY = 30 および PERIOD = 60 です。
この SchedulerExecutorService は、ServletContextListener の contextInitialized メソッドで開始されます。
スレッドの名前を含むログ メッセージを送信しています。最初にアプリケーションを起動すると、名前は pool-1-thread-1 になり、2 回目にスレッドを再起動すると、pool-2-thread-1 になります。 、3回目はpool-3-thread-1で、4回目は次の例外が発生しています
SEVERE: WSSERVLET11: failed to parse runtime descriptor: java.lang.OutOfMemoryError: PermGen space
リスナーの contextDestroyed メソッドには、次のコードがあります
testConnectionHandle.cancel(true);
scheduler.shutdownNow();
作成されたスレッド プールが破棄されることはなく、おそらくメモリ リークの問題があると思います。
私はTomcat 7.0.42を使用しています
誰でもこの問題で私を助けてくれますか?