我的Tomcat 7時的Java web應用程序的內存泄漏報道稱,有可能是內存泄漏在我的webapp使用ScheduledExecutorService的
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.
我在我的webapp一個長期運行的任務時,web應用程序啓動是被初始化。
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();
}
}
..和我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();
}
}
即使在關閉時服務器,它仍然報告有可能是內存泄漏我打電話scheduler.stop();
。
這個應用程序部署在jelastic.com上,我發現它一旦啓動,它運行良好大約兩天,然後任務似乎沒有運行。日誌中也沒有例外或錯誤。
我在這裏做錯了什麼嗎?是否真的存在內存泄漏?
嗯..我想這可能是在極少數情況下,我的任務運行每240分鐘,不應該超過幾分鐘才能完成。如果在第300分鐘,我儘量關機,當我的任務沒有運行,不應該能正常關機嗎?你的回答很可能是正確的,但我只是好奇:) – Krishnaraj 2012-03-29 18:13:54
@Krishnaraj你確定你的任務正如你認爲的那樣儘快結束嗎?您可能需要記錄任務開始/停止的時間,以確認其未被阻止。 – 2012-03-29 18:47:06
@ increment1是的,我的任務在不超過5分鐘內完成。 – Krishnaraj 2012-03-31 05:11:21