Ошибка ClassNotFoundException в Tomcat 5.5 и Tomcat 6.0
У меня странная проблема с серверами tomcat 5.5 и tomcat 6.0. У меня есть два веб-приложения, которые будут установлены на tomcat. Когда tomcat запущен, эти два веб-приложения также запускаются одновременно, но иногда одно веб-приложение не может инициализироваться из-за сбоя инициализации в одном приложении, другое приложение получает ошибки classnotfoundexception во время работы. В Tomcat 7.0 приложение работает нормально, даже если другое приложение не удалось инициализировать.
После некоторой отладки я узнал, что есть один jar с именем crystal.jar, который находится в папке web-inf / lib обоих приложений. Я переместил флягу в общую папку / lib папки tomcat, затем она начала работать нормально. Я хочу знать, почему он работает нормально в Tomcat 7.0, а не в версиях Tomcat 5.x и Tomcat 6.x. Есть ли какие-либо изменения в архитектуре загрузки классов между этими версиями?
Спасибо
EDIT1: библиотека находилась в каталоге обоих приложений WEB-INF\lib, и они не зависят от внешних DLLS. Только что я прочитал об архитектуре загрузчика классов tomcat 5.5 и узнал, что у каждого веб-приложения есть свой загрузчик классов. Библиотеки в папке WEB-INF\lib и папке классов будут загружены в этот загрузчик классов. Библиотеки, которые хранятся в общем каталоге, будут помещены в общий загрузчик классов. Затем эту библиотеку следует загружать отдельно в отдельный загрузчик классов веб-приложения. Таким образом, даже если одно веб-приложение не запускается, другое веб-приложение должно работать независимо. Вот почему я чувствовал себя странно и мне нужно исследовать Фуртура.
1 ответ
Наконец-то нашел ответ на эту проблему
Существует известный тип утечек памяти в PermGen, когда на класс библиотеки ссылается системный класс, и, следовательно, он устарел. Одним из примеров является случай, когда Java обнаруживает драйвер JDBC или какой-либо другой сервис и "автоматически регистрирует" его. Он сохраняет ссылку на него в системе, но сам класс принадлежит веб-приложению и должен быть выгружен при остановке приложения, но не может из-за этой ссылки. Не все такие ссылки легко очистить.
Одним из типичных симптомов в таком случае является то, что первое веб-приложение, которое использует эту системную функцию, будет выполнено успешно, а второе и другие выйдут из строя (поскольку служба, зарегистрированная в системе, принадлежит первому веб-приложению и не может видеть классы из загрузчик классов второго приложения и наоборот).
Tomcat 7 и последние версии Tomcat 6 имеют лучшую защиту от некоторых известных утечек памяти PermGen в конфигурации по умолчанию.
Tomcat 5.5 не имеет такой защиты вообще.
РЕДАКТИРОВАТЬ Некоторые ссылки
http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf
http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection