Tomcat жалуется, что поток не был остановлен - PullRequest
3 голосов
/ 10 октября 2011

Я получаю исключения о том, что потоки запускаются, а не заканчиваются или останавливаются.WebappClassLoader жалуется, что эти потоки вызовут утечку памяти.

Что здесь происходит?

  1. Возможно ли, что такие потоки вызовут утечку памяти?Или просто возможно?
  2. Является ли Каталина чрезмерно чувствительной?
  3. Является ли это даже допустимым методом программирования?меня. Но я должен изучить это, поскольку веб-приложение исчерпывает соединения с базой данных под высокой нагрузкой, и это должно быть решено. Поиск утечек памяти - одна из многих вещей, на которые мы обращаем внимание.)

1 Ответ

3 голосов
/ 10 октября 2011

Вы можете прочитать о сложных утечках памяти в Tomcat (и это предупреждение в частности) по адресу http://wiki.apache.org/tomcat/MemoryLeakProtection - в частности, для предупреждения, которое вы видите:

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

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

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

Воздействие этого (по моему опыту) ограничено, когда вы запускаете свое веб-приложение один раз, а затем просто разрываете его.Однако в некоторых случаях, например в сценарии непрерывной интеграции (когда ваш сервер CI многократно развертывает сборки вашего приложения в контейнере Tomcat, который не перезапускается), вы можете быстро исчерпать память в JVM.В конечном итоге это проявится как OutOfMemoryException в вашем регионе PermGen (при условии, что вы используете JVM Sun / Oracle).Подробнее о PermGen см. http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

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