My Tomcat 7 được báo cáo rằng có thể có một rò rỉ bộ nhớ trong webapp của tôiJava webapp rò rỉ bộ nhớ khi sử dụng 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.
Tôi có một nhiệm vụ chạy dài trong webapp của tôi mà được khởi tạo khi webapp được bắt đầu.
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();
}
}
.. và Scheduler.java tôi
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();
}
}
Mặc dù tôi gọi scheduler.stop();
khi tắt máy chủ, nó vẫn báo cáo có thể có một rò rỉ bộ nhớ.
Ứng dụng này được triển khai trên jelastic.com và tôi thấy rằng khi ứng dụng được bắt đầu, nó chạy tốt trong khoảng hai ngày và sau đó các tác vụ dường như không chạy. Cũng không có ngoại lệ hoặc lỗi trong nhật ký.
Tôi có làm gì sai ở đây không? Có thực sự là một rò rỉ bộ nhớ tiềm năng?
hmm .. Tôi nghĩ có thể trong một số trường hợp hiếm hoi. Nhiệm vụ của tôi chạy mỗi 240 phút và không mất quá vài phút để hoàn thành. không phải là chạy, không nên nó có thể tắt máy đúng cách? Câu trả lời của bạn có lẽ là đúng nhưng tôi chỉ tò mò :) – Krishnaraj
@Krishnaraj Bạn có chắc chắn rằng nhiệm vụ của bạn đang chấm dứt nhanh như bạn nghĩ? Bạn có thể muốn đăng nhập khi nhiệm vụ của bạn bắt đầu/dừng lại để xác minh nó không bị chặn. –
@ increment1 Có, nhiệm vụ của tôi hoàn thành trong không quá 5 phút. – Krishnaraj