2011-12-30 5 views
3

Я по-прежнему вижу эту ошибку в tomcat/logs/catalina.out.Catalina.out Ошибка утечки памяти

Dec 29, 2011 4:04:36 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/LoggingMonitor] appears to have started a thread named [Timer-1] but has failed to stop it. This is very likely to create a memory leak. 
Dec 29, 2011 4:04:36 PM org.apache.coyote.http11.Http11Protocol destroy 
INFO: Stopping Coyote HTTP/1.1 on http-8180 

Стоит ли рассматривать, и если да, то как я могу исправить это?

ответ

3

Это, вероятно, не большое дело (просто убить -9 или что-то) и достаточно легко исправить. Просто выяснить, какие веб-приложение в забеге на контексте/LoggingMonitor затем Grep его кодовую для ...

new Timer(); 

... и заменить их всех ...

new Timer(true); 

java.util. Таймер по умолчанию не запускается в потоках демона. Вам нужны какие-либо таймеры в вашем webapps для работы в потоках демона (иначе контейнер не сможет нормально завершить работу, так как он ждет окончания потока Timer, чего он никогда не делает). Найдите все вызовы «нового таймера»() и замените их «новым таймером» (true) », и жалоба о регистрации должна прекратиться.

Проведите некоторое время в JavaDocs узнать что-то о демоне против демонов, не являющихся Threads: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html

Когда я работаю в WebApps, я всегда использую демон тему, если я в конечном итоге делаю любой из моей собственной многопоточности. С возможностями в java.util.concurrent это становится очень редким (нужно делать собственный материал Threading).

И, наконец, для записи я ненавижу java.util.Timer и всегда рекомендую использовать что-то вроде ScheduledExecutor для выполнения периодических, повторяющихся задач. Его слишком легко ввернуть в таймер и вынуть протектор, который он выполняет, демон или иначе.

+0

На самом деле то, что я делаю, это мониторинг файла журнала, который постоянно обновляется, и я делаю это с помощью таймера, который запускается после каждой секунды. Возможно, вы предложите какую-нибудь лучшую технику, оцените, – Rookie

+1

предупреждающее сообщение похоже, когда сервер все еще работает. Потенциально, если просто перезапустить webapp. Свойство daemon не собирается исправлять это. Он должен полностью выйти из контекстного события сервлета для выключения. –

2

Это сообщение не имеет большого значения, если вы всегда остановить Tomcat, когда вы отменить развертывание/передислокацию приложение в противном случае эти операции вызывают утечки памяти, является большое дело, EXPECIALLY в производстве.

Темы с именем «Timer- #» создаются java.util.Timer (и, возможно, другими классами), как это было предложено Bob Kuhar, но grepping вашей собственной базы кода может быть недостаточным и гарантировать, что вы используете потоки демона, не устраняет это сообщение (комментарий Тома Хотина верен).

Когда я получил это сообщение он был произведен транзитивной зависимости от моего кода, именно по классу GenericObjectPool из Apache Commons Pool v1.3, который использует демон нить (см source code). Чтобы найти класс, который создает экземпляр таймера, мне пришлось поставить брек-точку в каждый конструктор класса Timer, а затем я рассмотрел стек вызовов. Чтобы решить проблему, мне пришлось обновить библиотеку (более новые версии Commons Pool не используют этот таймер).

Когда вы контролируете код, создающий поток, вы можете решить проблему, гарантируя, что вы остановите поток, когда приложение остановится. Использование потоков демона - хорошая практика, но этого недостаточно, потому что потоки демона автоматически умирают только при выключении Tomcat, но не при развертывании приложения.

В более общем случае, когда вы не знаете, кто создал неприятную нить, проверьте Finding Source of Thread Creation in a Java application и Detect Who Created a Thread (w. Eclipse).

UPDATE

Совершенно иной подход заключается в использовании очень интересный Leak Prevention Listener. Также прочитайте другие сообщения об утечках загрузчика классов этого автора.

Смежные вопросы