Ошибка ClassNotFoundException в Tomcat 5.5 и Tomcat 6.0
У меня возникает эта странная проблема с серверами tomcat 5.5 и tomcat 6.0. У меня есть два веб-приложения, которые будут установлены на tomcat. При запуске tomcat эти два веб-приложения также запускаются одновременно, но иногда одно веб-приложение не может инициализироваться из-за сбоя init в одном приложении, при запуске другого приложения возникают ошибки classnotfoundexception. В tomcat 7.0 приложение работает нормально, даже если другое приложение не удалось инициализировать.
После некоторой отладки я узнал, что есть одна банка с именем crystal.jar, которая находится в папке web-inf/lib обоих приложений. Я переместил банку в общую папку /lib tomcat, после чего начал работать нормально. Я хочу знать, почему он отлично работает в tomcat 7.0, а не в версиях tomcat 5.x и tomcat 6.x. Есть ли какие-либо изменения в архитектуре загрузки классов между этими версиями?
Спасибо
EDIT1: Библиотека находилась в каталоге обоих приложений WEB-INF\lib, и они не имеют зависимости от внешних DLLS. Только сейчас я прочитал о архитектуре classloader tomcat 5.5 и узнал, что у каждого веб-приложения есть свой собственный загрузчик классов. Библиотеки в папке WEB-INF\lib и папках будут загружены в этот загрузчик классов. Библиотеки, которые хранятся в общем каталоге, будут помещены в общий загрузчик классов. Затем эту библиотеку следует загружать отдельно в отдельном загрузчике классов веб-приложения. Там, даже если одно веб-приложение не запускается, другое веб-приложение должно работать независимо. Вот почему я чувствовал себя странно и нужно исследовать фурт.
Ответы
Ответ 1
Наконец Нашел ответ для этой проблемы
Существуют известные типы утечек памяти PermGen, когда класс библиотеки
ссылается на системный класс и, следовательно, живет за пределами своего возраста. Один
Например, когда Java обнаруживает драйвер JDBC или какую-либо другую услугу
и "автоматически регистрирует" его. Он ссылается на него в
, но сам класс принадлежит веб-приложению и должен
выгружаться при остановке приложения, но не может, из-за этого
Справка. Не все такие ссылки легко прояснить.
Одним из типичных симптомов в этом случае является то, что первое веб-приложение
который полагается на эту функцию системы, будет успешным, но второй и
другие будут терпеть неудачу (поскольку служба, зарегистрированная в
система принадлежит первому веб-приложению и не может видеть классы из
classloader второго приложения и наоборот).
Tomcat 7 и последние версии Tomcat 6 имеют лучшую защиту
против некоторых известных утечек памяти PermGen в их умолчанию
конфигурации.
Tomcat 5.5 вообще не имеет такой защиты.
EDIT Некоторые ссылки
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://eclipse.org/mat/
http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics
http://wiki.apache.org/tomcat/MemoryLeakProtection