как настроить Tomcat, чтобы классы из предыдущих запусков не оставались в памяти - PullRequest
0 голосов
/ 12 сентября 2018

Вкл. tomcat/manager при нажатии на кнопку find leaks появляется следующее сообщение:

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

Это на самом деле вызывает у меня большие проблемы, потому что когда мне нужно повторно развернуть приложение с некоторыми изменениями, старая версия остается на сервере, и когда я пытаюсь ее использовать, я получаю:

IllegalStateException: Illegal access: this web application instance has been stopped already

Хотя в tomcat / manager приложение отображается как запущенное.

Как мне решить эту проблему? Я посмотрел на здесь , но не решил проблему. Я попытался запустить команду jps, чтобы получить pid JVM, но она не возвращает JVM, я думаю, из-за проблемы с permissoin.

Можно ли как-то настроить tomcat таким образом, чтобы, когда приложение не развернуто, оно не сохраняло какие-либо классы этого приложения в памяти?

Вопрос Как очистить кэш Tomcat при развертывании нового .war-файла? Есть ли параметр конфигурации? не решает мою проблему, так как я выполнил приведенные там шаги:

  • отменить развертывание приложения
  • стоп кот
  • удалить приложение из каталога `work` tomcat
  • очистить кеш браузера
  • Старт кота
  • положить файл войны в `webapps`
  • подождите несколько минут
  • запустить приложение

эти шаги не решили проблему

1 Ответ

0 голосов
/ 13 сентября 2018

Нет способа настроить tomcat для удаления классов, на которые все еще есть ссылки. Самый простой способ (вероятно, не единственный) вызвать это - запустить поток из вашего веб-приложения, а не завершить его, когда приложение не развернуто: для Tomcat этот поток тогда недоступен, но для JVM запущенный поток является допустимый корень для классов, которые не могут быть собраны сборщиком мусора.

Tomcat делает все возможное, чтобы обнаружить и указать такое условие, но на самом деле не может пойти против JVM и сборщика мусора и отбросить совершенно допустимые объекты, на которые все еще ссылаются.

Шаги, которые вы делаете, включая остановку и запуск tomcat, кажутся невозможными: после того, как вы завершите работу JVM, единственный шанс для вновь запущенной JVM сослаться на старые классы, если он овладеет ими. Но вы также заявляете, что удаляете рабочий каталог (как насчет временного каталога?). Вы также должны убедиться, что вы действительно удаляете нужный контент, а не контент какого-либо другого сервера в аналогичном каталоге. Кроме этого: кажется, вы просто упускаете почти очевидное место, где расположены старые классы. Как только они будут перезапущены, может возникнуть условие, которое я описал выше. Реализация веб-приложения никак не может обеспечить хорошее поведение и не запускать случайные фоновые потоки, не прерывая их.

Возможно, вы захотите проверить, отличаются ли CATALINA_HOME и CATALINA_BASE, и могут дать подсказку о других приложениях, развернутых под тем же именем, и если ваше приложение запускается, когда вы просто удаляете файлы, которые вы описали, то запускайте (без нового развертывания)

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