2012-06-07 14 views
7

Sto riscontrando questo strano problema con i server tomcat 5.5 e tomcat 6.0. Ho due applicazioni web che verranno installate su tomcat. Quando viene avviato tomcat, queste due applicazioni Web vengono avviate simultaneamente, ma a volte un'applicazione Web non riesce a inizializzarsi a causa dell'errore di init in un'applicazione, mentre un'altra applicazione riceve errori di classenotfoundException durante l'esecuzione. In tomcat 7.0 l'applicazione funziona correttamente anche se l'altra applicazione non è stata inizializzata.Errore ClassNotFoundException in Tomcat 5.5 e Tomcat 6.0

Dopo un po 'di debug sono venuto a sapere che c'è un jar chiamato crystal.jar che si trova nella cartella web-inf/lib di entrambe le applicazioni. Ho spostato il jar nella cartella common/lib di tomcat, quindi ha iniziato a funzionare correttamente. Voglio sapere perché funziona bene in Tomcat 7.0, non nelle versioni tomcat 5.xe tomcat 6.x. C'è qualche cambiamento nel classloading dell'architettura tra queste versioni?

Grazie

Edit1: La biblioteca era in una posizione di entrambe le directory delle applicazioni WEB-INF \ lib e non hanno alcuna dipendenza con le DLL esterne. Proprio ora ho letto dell'architettura del classloader tomcat 5.5 e sono venuto a sapere che ogni applicazione web ha il proprio caricatore di classe. Le librerie nella cartella delle cartelle e delle classi WEB-INF \ lib verranno caricate in questo classloader. Le librerie memorizzate in una directory comune verranno collocate in un classloader condiviso. Quindi questa libreria dovrebbe essere caricata separatamente in un caricatore di classi separato dell'applicazione web. Lì anche se un'applicazione web non riesce ad avviare un'altra applicazione web dovrebbe funzionare in modo indipendente. Ecco perché mi sono sentito strano e ho bisogno di indagare su furthur.

risposta

6

finalmente trovato la risposta a questo problema

Esistono una specie conosciuta di perdite di memoria PermGen, quando una classe libreria fa riferimento a una classe di sistema e vive quindi oltre la sua età. Un esempio di è quando Java scopre un driver JDBC o qualche altro servizio e "lo registra automaticamente". Si riferisce ad esso in un sistema , ma la classe stessa appartiene all'applicazione Web e deve essere scaricata quando l'applicazione si arresta, ma non può, a causa di tale riferimento . Non tutti questi riferimenti sono facili da chiarire.

Un sintomo tipico in tal caso è che la prima applicazione web che si basa su questa caratteristica del sistema avrà successo, ma il secondo e altri quelli fallirà (perché il servizio che viene registrato nel sistema appartiene alla prima applicazione web e non può vedere le classi dal classloader della seconda applicazione e viceversa).

Tomcat 7 e le versioni recenti di Tomcat 6 hanno una protezione migliore rispetto a determinate perdite di memoria PermGen note nella configurazione predefinita .

Tomcat 5.5 non dispone di tale protezione.

EDIT Alcuni riferimenti

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

Così avete appena aumentato MaxPermSize, giusto? –