2016-11-20 2 views
1

Я знаю, что Tomcat может перезагрузить файл .war при его повторном развертывании, мне не нужно убивать процесс Tomcat и перезагружать его. Я могу удалить .war, дождаться, когда Tomcat распакует его, и скопируйте новый .war на веб-путь. Но, после многократного тривиального возобновления войны без перезапуска Tomcat, возможно ли, что Tomcat не сможет эффективно освободить память или вызвать некоторые проблемы с производительностью? Предположим, что в одном экземпляре Tomcat имеется только одно военное приложение.Нужно ли перезагружать tomcat при перераспределении войны?

ответ

2

Основная проблема заключается в том, что Java в настоящее время не обеспечивает никакой изоляции между частями кода, запущенными в Java Virtual Machine (JVM), таким же образом, что и operating system does with processes. Вы можете убить процесс, не затрагивая другой процесс под Windows/Linux/etc. Все, что вы можете сделать, это обеспечить, чтобы вещи могли быть собраны мусором.

Для Tomcat используется то, что обрабатывается WAR - согласно various specifications - требует, чтобы каждая война имела свой собственный загрузчик классов, который отвечает за запуск этого кода. Когда WAR нераспределен, конечным результатом должно быть то, что загрузчик этого класса должен быть собран мусором.

К сожалению, garbage collector может обрабатывать объекты, которые полностью не найдены, и существует большой набор тонких ошибок, которые могут присутствовать в WAR-коде, который может запретить это, а затем каждый повторный развертывание вызывает создание другого загрузчика классов и не уничтожается так что у вас есть утечка памяти. Много усилий было предпринято для обнаружения и работы с этими типами ошибок внутри самого Tomcat, но практически невозможно сделать 100% без поддержки JVM.

Единственное лекарство, помимо фиксации WAR, - это перезапустить JVM.

Вы можете наблюдать за использованием памяти с помощью VisualVM даже в производстве, чтобы узнать, что происходит со временем с JVM Tomcat.

+0

Обратите внимание, что _разработка_ WAR сильно отличается от _deploying_ WAR. В вашей среде IDE должен быть идеальный контроль над веб-контейнером, где часто происходят горячие развертывания, в отличие от рутинного развертывания - обычно. Другими словами, это должно происходить относительно редко. –

0

Да. Гораздо чище остановить Tomcat, развернуть новую войну, а затем перезапустить Tomcat. Один из недостатков заключается в том, что многие из ваших классов приложений по умолчанию не будут загружены до тех пор, пока не поступит новый запрос, чтобы поразить ваше приложение, но это не проблема. Просто означает, что на несколько секунд после первого запроса на новую WAR. Именно так мы развертываем войны в производстве.

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

Что относительно времени простоя?

Это может быть вне сферы вашего вопроса, но если вы хотите, чтобы пользователи не видели время простоя, вы запускали несколько экземпляров tomcat и развертывали и перезапускали по одному.