Веб-приложение, похоже, запустило поток с именем [22], но не смогло его остановить. Это, скорее всего, приведет к утечке памяти

#java #multithreading #servlets

#java #многопоточность #сервлеты

Вопрос:

У меня есть веб-приложение с сервлетами в серверной части, развернутое поверх tomcat. Приложение является простым Java-приложением.

Я часто вижу эту ошибку в журналах сервера: СЕРЬЕЗНЫЙ: веб-приложение, похоже, запустило поток с именем [22], но не смогло его остановить. Это с большой вероятностью приведет к утечке памяти.

Существуют ли какие-либо потенциальные причины, которые могут быть причиной этого?

Ответ №1:

Я бы использовал visualvm 1.3.2 и посмотрел, какие потоки создаются. Обязательно добавьте все подключаемые модули.

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

Вы также не знаете, является ли сообщение отвлекающим маневром или нет. Нагрузочное тестирование вашего кода в течение определенного периода времени и измерение того, что происходит.

Ответ №2:

Я столкнулся с аналогичной ситуацией, недавно разрешенной в следующих шагах

  1. Я взял дамп потока. ( используя pid Kill -QUIT )
  2. Найден дамп формы класса Runnable / Thread
  3. Затем я поместил точку отладки в метод run и запустил приложение в режиме отладки.
  4. Получил код, который запускает мой поток, и я заметил, что он не был остановлен при остановке приложения.
  5. Введен код для остановки потока в contextDestroyed методе AppContextListener (это мой класс приложения, который расширяет ServletContextListener ), поскольку этот метод будет вызван, когда я остановлю tomcat.

Если вы установите Thread как Dameon Thread, это не поможет, вы можете посетить объяснение.

Ответ №3:

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