0

次のコードに示すように、プール サイズが 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を使用しています

誰でもこの問題で私を助けてくれますか?

4

0 に答える 0