2012-06-07 10 views
7

Ich habe dieses seltsame Problem mit den Tomcat 5.5 und Tomcat 6.0-Servern. Ich habe zwei Web-Anwendungen, die auf Tomcat installiert werden.Wenn Tomcat gestartet wird, werden diese zwei Web-Anwendungen auch gleichzeitig gestartet, aber manchmal eine Web-Anwendung nicht initialisiert wegen der Init-Fehler in einer Anwendung eine andere Anwendung erhält ClassnotFundException Fehler während der Ausführung. In Tomcat 7.0 läuft die Anwendung gut, auch wenn die andere Anwendung nicht initialisiert werden konnte.ClassNotFoundException Fehler in Tomcat 5.5 und Tomcat 6.0

Nach einigem Debugging habe ich erfahren, dass es ein jar mit dem Namen crystal.jar gibt, das sich im web-inf/lib Ordner beider Anwendungen befindet. Ich habe das Glas in den Ordner common/lib von Tomcat verschoben, dann hat es gut funktioniert. Ich möchte wissen, warum es in Tomcat 7.0 nicht in Tomcat 5.x und Tomcat 6.x-Versionen funktioniert. Gibt es Änderungen in der Architektur zum Laden von Klassen zwischen diesen Versionen?

Dank

EDIT1: wurde die Bibliothek in der Lage sowohl die Anwendungen WEB-INF \ lib und sie haben keine Abhängigkeit mit dem externen DLLs. Gerade habe ich über tomcat 5.5 classloader architecture gelesen und festgestellt, dass jede Webanwendung ihren eigenen Klassenlader hat. Die Bibliotheken im Ordner WEB-INF \ lib und Klassen werden in diesen Klassenlader geladen. Die Bibliotheken, die unter dem gemeinsamen Verzeichnis gespeichert sind, werden in einen gemeinsamen Klassenlader gestellt. Dann sollte diese Bibliothek separat im separaten Klassenlader der Webanwendung geladen werden. Selbst wenn eine Webanwendung nicht gestartet werden kann, sollte eine andere Webanwendung unabhängig arbeiten. Deshalb fühlte ich mich komisch und musste Nachforschungen anstellen.

Antwort

6

endlich die Antwort für dieses Problem

eine bekannte Art von PermGen Speicherlecks Es gibt, wenn eine Bibliotheksklasse durch eine Systemklasse verwiesen wird und damit über sein Alter lebt. Ein Beispiel ist, wenn Java einen JDBC-Treiber oder einen anderen Dienst entdeckt und "automatisch registriert". Es behält Bezug auf es in einem System, aber die Klasse selbst gehört zu der Web-Anwendung und muss entladen werden, wenn die Anwendung stoppt - aber kann nicht, deshalb Referenz. Nicht alle derartigen Referenzen sind leicht zu klären.

Ein typisches Symptom in einem solchen Fall, dass die erste Web-Anwendung , die auf diesem System Funktion setzt erfolgreich sein wird, aber die zweite und andere, die scheitern wird (weil der Dienst, der erste gehört in der System registriert ist Web-Anwendung und kann keine Klassen von Classloader der zweiten Anwendung und umgekehrt).

Tomcat 7 und neuere Versionen von Tomcat 6 haben einen besseren Schutz gegen bestimmte bekannte PermGen Speicherlecks in ihrer Standardkonfiguration .

Tomcat 5.5 hat keinen solchen Schutz.

EDIT Einige Referenzen

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

So haben Sie gerade MaxPermSize erhöht, nicht wahr? –