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,第二次重新启动线程名称是 pool-2-thread-1 ,第三次是 pool-3-thread-1 第四次我得到以下异常

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