Нужно ли перезапускать кота при повторном развертывании войны?
Я знаю, что Tomcat может перезагрузить .war
файл при повторном развертывании, мне не нужно убивать процесс Tomcat и перезапустить его. Я могу удалить .war
подождите, пока Tomcat не развернет его, и скопируйте новый .war
к веб-пути. Но, после многократной войны за обновление без перезапуска Tomcat, возможно ли, что Tomcat не освободит память эффективно или вызовет некоторые проблемы с производительностью? Предположим, что в одном экземпляре Tomcat есть только одно военное приложение.
2 ответа
Основная проблема заключается в том, что Java в настоящее время не обеспечивает какой-либо изоляции между частями кода, работающего на виртуальной машине Java (JVM), так же, как операционная система работает с процессами. Вы можете убить процесс, не затрагивая другой процесс в Windows/Linux/etc. Все, что вы можете сделать, это обеспечить сбор мусора.
Для Tomcat способ обработки WAR- согласно различным спецификациям - требует, чтобы каждая война имела свой собственный загрузчик классов, который отвечает за выполнение этого кода. Когда WAR не развернут, окончательный результат должен заключаться в том, что этот загрузчик классов должен быть подвергнут сборке мусора.
К сожалению, сборщик мусора может обрабатывать только те объекты, на которые нет ссылок, и в коде WAR может присутствовать большой набор незаметных ошибок, которые могут запретить это, и затем каждое повторное развертывание приводит к созданию другого загрузчика классов, и ни один из них не уничтожается, так что у вас есть утечка памяти. Много усилий было потрачено на обнаружение и устранение таких ошибок в самом Tomcat, но практически невозможно сделать 100% без поддержки JVM.
Единственное лекарство помимо исправления WAR - перезапустить JVM.
Вы можете наблюдать за использованием памяти с VisualVM даже в производственном режиме, чтобы увидеть, что происходит со временем с Tomcat JVM.
Да. Гораздо чище остановить Tomcat, развернуть новую войну и перезапустить Tomcat. Одним из недостатков является то, что большая часть классов вашего приложения по умолчанию не будет загружена до тех пор, пока не поступит новый запрос, чтобы поразить ваше приложение, но это не является большой проблемой. Просто означает несколько секунд запуска при первом запросе вашей новой WAR. Вот как мы разворачиваем войны в производстве.
Также позволяет нам настроить проверку работоспособности в журналах, если новая война не позволяет Tomcat правильно запускаться, тогда мы откатываем войну, зная, что есть проблема, но это отдельная тема.
Что насчет простоя?
Возможно, это выходит за рамки вашего вопроса, но если вы хотите, чтобы пользователи не видели простоев, вы запускаете несколько экземпляров tomcat, развертываете и перезапускаете по одному за раз.