我正在使用池大小为 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
有人可以帮我解决这个问题吗?