使用ScheduledExecutorService时,Java webapp内存泄漏

Kri*_*raj 5 java tomcat memory-leaks

我的Tomcat 7报告我的webapp可能存在内存泄漏

SEVERE: The web application [/mywebapp] appears to have started a 
thread named [pool-1-thread-1] but has failed to stop it. This is 
very likely to create a  memory leak.
Run Code Online (Sandbox Code Playgroud)

我的webapp中有一个长时间运行的任务,当webapp启动时会被初始化.

public class MyContextListener implements ServletContextListener{
Scheduler scheduler = null;

public MyContextListener(){
    scheduler = new Scheduler();
}

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    scheduler.stop();
}

@Override
public void contextInitialized(ServletContextEvent arg0) {
    scheduler.start();
}

}
Run Code Online (Sandbox Code Playgroud)

..和我的Scheduler.java

public class Scheduler {
private final ScheduledExecutorService fScheduler;

public Scheduler() {
    fScheduler = Executors.newScheduledThreadPool(1);
}


public void start(){
    fScheduler.scheduleWithFixedDelay(new Runnable() {

        @Override
        public void run() {
            //Perform some task
        }
    }, 1, 240, TimeUnit.MINUTES);
}

public void stop(){
    fScheduler.shutdownNow();
}
Run Code Online (Sandbox Code Playgroud)

}

即使我scheduler.stop();在关闭服务器时调用,它仍然报告可能存在内存泄漏.

这个应用程序部署在jelastic.com上,我发现它一旦启动,它运行良好大约两天,然后任务似乎没有运行.日志中也没有例外或错误.

我在这里做错了吗?真的存在潜在的内存泄漏吗?

Tom*_*icz 6

打电话fScheduler.shutdownNow();还不够:

除尽力尝试停止处理主动执行任务之外,没有任何保证.

来自JavaDoc.

相反,您必须明确等待当前正在运行的任务:

fScheduler.shutdownNow();
fScheduler.awaitTermination(10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)