#java #multithreading #servlets
#java #многопоточность #сервлеты
Вопрос:
У меня есть веб-приложение с сервлетами в серверной части, развернутое поверх tomcat. Приложение является простым Java-приложением.
Я часто вижу эту ошибку в журналах сервера: СЕРЬЕЗНЫЙ: веб-приложение, похоже, запустило поток с именем [22], но не смогло его остановить. Это с большой вероятностью приведет к утечке памяти.
Существуют ли какие-либо потенциальные причины, которые могут быть причиной этого?
Ответ №1:
Я бы использовал visualvm 1.3.2 и посмотрел, какие потоки создаются. Обязательно добавьте все подключаемые модули.
Если это не выполняется вашим кодом, у вас не будет большого контроля над ним.
Вы также не знаете, является ли сообщение отвлекающим маневром или нет. Нагрузочное тестирование вашего кода в течение определенного периода времени и измерение того, что происходит.
Ответ №2:
Я столкнулся с аналогичной ситуацией, недавно разрешенной в следующих шагах
- Я взял дамп потока. ( используя pid Kill -QUIT )
- Найден дамп формы класса Runnable / Thread
- Затем я поместил точку отладки в метод run и запустил приложение в режиме отладки.
- Получил код, который запускает мой поток, и я заметил, что он не был остановлен при остановке приложения.
- Введен код для остановки потока в contextDestroyed методе AppContextListener (это мой класс приложения, который расширяет ServletContextListener ), поскольку этот метод будет вызван, когда я остановлю tomcat.
Если вы установите Thread как Dameon Thread, это не поможет, вы можете посетить объяснение.
Ответ №3:
Tomcat ожидает остановки всех потоков приложения (пользовательских потоков, а не потоков демонов), прежде чем оно отключится, я предполагаю, что в вашем случае этот конкретный поток является пользовательским потоком, и поэтому tomcat сгенерировал эту ошибку. Я предлагаю вам изменить этот поток на daemon (предполагая, что это ваш)