Возможная утечка памяти при использовании Tomcat - PullRequest
3 голосов
/ 29 сентября 2010

Я разработал веб-приложение, которое широко использует потоки. Нам нужно следить за некоторыми ресурсами через определенные промежутки времени, а затем действовать.

Чтобы достичь этого, мы разработали ThreadManager, который охватывает one ScheduledThreadPoolExecutor. Мы разрешаем любой из методов исполнителя, мы используем этот менеджер только для того, чтобы убедиться, что все используют один и тот же экземпляр пула потоков (менеджер - Singleton ...)

Затем, когда мы закрываем контекст, у нас есть ServletContextListener, который заботится о правильном закрытии исполнителя:

 ejecutor.shutdown();
 try
 {
      ejecutor.awaitTermination(10, TimeUnit.SECONDS);
 }
 catch (InterruptedException ie)
 {
     Thread.currentThread().interrupt();
 }
 System.out.println("Llamo al shutdownnow");
 ejecutor.shutdownNow();
 ejecutor = null;

Но затем, когда мы закрываем tomcat / unload контекст, мы получаем множество ошибок, говорящих:

GRAVE: The web application [/qsys] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak.

Если мы отслеживаем исполнителя, спрашивая количество активных потоков, после завершения работы он продолжает говорить, что активных потоков больше нет, но мы продолжаем обнаруживать ту же ошибку на tomcat.

Есть идеи?

Обновление: больше информации предоставлено Зависшие потоки - это те, которые запланированы в Executor. Все они переопределяют interrupt() так, что это выглядит так:

System.out.println("Me intentan interrumpir!!");
run = false;
super.interrupt();

Затем, во время contextDestroyed, я выполняю уже упомянутое завершение работы ... но система из прерывания даже не печатается!

Исполнителю присвоено значение ExecuteExistingDelayedTasksAfterShutdownPolicy, равное false ...

По-прежнему поддерживать темы ...

1 Ответ

0 голосов
/ 04 октября 2010

Наконец-то я кое-что выяснил:

Каждый раз, когда я использую ScheduledThreadPoolExecutor, tomcat не может закрыть объединенные потоки при отмене / закрытии / перезапуске, что приводит к возможной утечке памяти (это должнопроблема, потому что tomcat не может их закрыть, но после того, как он их убивает, так что нет проблем, но заказчик не допустит этого ...), в то время как другие серверы работают как прелесть ...

На самом делеЯ создал ScheduledThreadPoolExecutor с размером ядра 25, затем выключил его (ничего не работает и не запланировал), и tomcat все еще не смог очистить объединенные потоки.

Поэтому я решил использовать таймер, пока я жду патча... (это случилось с Tomcat 6.0 и JDK 1.5.0_22)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...