2012-06-07 30 views
7

Mam ten dziwny problem z serwerami tomcat 5.5 i tomcat 6.0. Mam dwie aplikacje internetowe, które będą instalowane na tomcat. Gdy uruchomi się tomcat, te dwie aplikacje internetowe również zostaną uruchomione jednocześnie, ale czasami jedna aplikacja internetowa nie może się uruchomić z powodu błędu init w jednej aplikacji, inna aplikacja otrzymuje błędy classnotfoundexception podczas działania. W tomcat 7.0 aplikacja działa poprawnie, nawet jeśli nie można zainicjować drugiej aplikacji.Błąd ClassNotFoundException w Tomcat 5.5 i Tomcat 6.0

Po pewnym debugowaniu dowiedziałem się, że istnieje jeden jar o nazwie crystal.jar, który znajduje się w folderze web-inf/lib obu aplikacji. Przeniosłem słoik do wspólnego katalogu/lib tomcat, a następnie zaczął działać poprawnie. Chcę wiedzieć, dlaczego działa dobrze w tomcat 7.0, a nie w tomcat 5.x i tomcat 6.x. Czy są jakieś zmiany w architekturze ładowania klas między tymi wersjami?

Dzięki

Edit1: Biblioteka była w miejscu, zarówno aplikacji WEB-INF \ lib i nie mają zależność z zewnętrznych bibliotek. Właśnie przeczytałem o architekturze klas ładujących tomcat 5.5 i dowiedziałem się, że każda aplikacja internetowa ma swój własny moduł ładujący klasy. Biblioteki w folderze folder i klasy WEB-INF \ lib zostaną załadowane do tego programu ładującego klasy. Biblioteki, które są przechowywane w katalogu wspólnym, zostaną umieszczone we współużytkowanym programie ładującym klasy. Następnie tę bibliotekę należy załadować oddzielnie w oddzielnym programie ładującym klasy aplikacji internetowej. Tam nawet jeśli jedna aplikacja internetowa nie uruchomi się, inna aplikacja internetowa powinna działać niezależnie. Dlatego czułam się dziwnie i muszę zbadać Furthura.

Odpowiedz

6

końcu znaleźć odpowiedź na ten problem

istnieją znanego rodzaju wycieków pamięci PermGen, gdy klasa biblioteka odwołuje klasy systemu, a tym samym mieszka poza jego wiek. Przykładem może być sytuacja, gdy Java odkryje sterownik JDBC lub inną usługę i "automatycznie zarejestruje" go. Zachowuje odwołanie do niego w systemie , ale sama klasa należy do aplikacji internetowej i musi zostać rozładowana po zatrzymaniu aplikacji - ale nie może, z powodu tego odniesienia . Nie wszystkie takie odniesienia są łatwe do wyjaśnienia.

Typowym objawem w takim przypadku jest to, że pierwsza aplikacja internetowa który opiera się na tej funkcji systemowej uda, ale drugi i inne te nie powiedzie się (ponieważ usługa, która jest zarejestrowana w systemie na należy najpierw aplikacja internetowa i nie widzą klas z klasy drugiej aplikacji i vice versa).

Tomcat 7 i najnowsze wersje Tomcat 6 mają lepszą ochronę przed pewnymi znanymi wyciekami pamięci PermGen w ich domyślnej konfiguracji .

Tomcat 5.5 nie ma takiej ochrony w ogóle.

EDIT Niektóre odnośniki

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

+0

Tak właśnie zwiększona MaxPermSize, prawda? –