
У меня есть сервер Tomcat 6 на сервере Ubuntu 12.04 с 4 ГБ и следующими JAVA_OPTS
JAVA_OPTS="-Djava.awt.headless=true -Xms512M -Xmx512M -XX:PermSize=1024M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
Глупый вопрос: если я разверну одно и то же веб-приложение (один и тот же файл war) несколько раз (каждый из которых будет ссылаться на другую базу данных Postgres) — как server.com:8080/webapp1 server.com:8080/webapp2 и т. д.
Могу ли я предположить, что Tomcat будет кэшировать файлы классов один раз для нескольких веб-приложений? Или - Tomcat кэширует классы для каждого веб-приложения?
Спасибо заранее, Дэнни.
решение1
Ответ зависит от того, где вы разместили файл(ы) классов, используемые вашим веб-приложением.
Если вы поместите заданный класс в путь загрузчика классов Tomcat Common $CATALINA_HOME/lib, он будет доступен всем веб-приложениям. То же самое касается его кэшированной формы.
Если вы используете путь загрузчика классов веб-приложения Tomcat webapps/веб-приложение/WEB-INF/классы и веб-приложения/веб-приложение/WEB-INF/lib классы и соответствующие кэши классов изолированы между приложениями.
Техническое образование
Tomcat не соответствует изначальному способу обработки классов Java, а использует собственный загрузчик классов Java. Это необходимо для реализации ряда функций, связанных с:
- обработка классов в веб-приложении
- кэширование классов на веб-приложение
- предварительная загрузка и повторная загрузка классов при запуске/выполнении веб-приложения
- безопасность при загрузке/ссылке на классы
Пользовательский загрузчик классов Tomcat использует загрузчики классов Bootstrap, Extension и System по умолчанию для Java, но заменяет переменную classpath, используемую загрузчиком классов System, на свой собственный classpath. Это имеет следующий эффект:
- замена механизма переопределения одобренных стандартов, поставляемого с Java, на собственный механизм Tomcat.
добавление двух дополнительных загрузчиков классов в конец иерархии загрузки классов Java:
- Загрузчик классов Tomcat Common
- Отдельный загрузчик классов для каждого веб-приложения
Исходный classpath игнорируется Tomcat.
Ключевой деталью является то, что загрузчик классов веб-приложений не делегирует загрузку классов своим родителям, а пытается загрузить каждый класс по мере его запроса. Каждый загруженный класс впоследствии кэшируется соответствующим загрузчиком классов веб-приложений. Этот уровень загрузчика классов/кэша не может быть общим для разных веб-приложений.
Все классы, загруженные загрузчиком классов Common, становятся общедоступными для всех веб-приложений, включая кэш. Обширное размещение классов в пути загрузчика классов Common не рекомендуется, поскольку это:
- нарушает переносимость
- Требования к версии класса могут различаться для Tomcat и различных веб-приложений.
- становится проблемой обслуживание: какой класс к чему принадлежит?
К процессу загрузки/кэширования/перезагрузки классов прилагается довольно много мелкого шрифта. Если это важно, я бы посоветовал вам прочитать замечательную главу о загрузке классов вПрофессиональный Apache Tomcat 6.
Сжатая версия была написана кем-то наэтотстраница.