Hallo!
Ich habe ein Problem mit einem Tomcat-Servlet. Das Servlet an sich verbaucht mit der Zeit immer mehr Speicher. Das eigentliche Problem tritt jedoch auf, wenn die Anwendung beendet wird. Der Speicherverbauch des Tomcats sinkt nicht mehr. Im Tomcat-Manager wird "Free Memory" nicht wesentlich erhöht, wenn die Anwendung beendet wurde. Starte und beende ich die Anwendung mehrere Male, so verliert der Tomcat immer mehr Speicher, bis er schließlich eine OutOfMemoryException wirft.
Ich habe folgende Überlegungen angestellt, woher es kommen könnte:
1. Es werden String + String + String - Kommandos großflächig eingesetzt um SQl-Queries abzufragen. Können die dadurch generierten internal Strings eventuell den Speicher zumüllen. Werden diese Strings bei der JVM 5.0 tatsächlich "nie" aufgeräumt, wie es in manchen Threads zu lesen ist
2. Verbindungen zur Datenbank. Wird die Applikation nicht ordnungsgemäß beendet (einfach Browser-Fenster schließen), wird keine Aufräum-Methode gestartet. Damit bleibt auch die Verbindung zur DB bestehen. Diese sollte doch aber nach einer gewissen Zeit ein Timout bekommen, oder?
3. Context. Wird die Applikation nicht ordnungsgemäß beendet, wird der gesamte Context ja nicht ordentlich aufgeräumt (siehe auch Verbindungen zur Datenbank, der im Context gehalten wird). Wird dieser nie aufgeräumt? Wenn die Session ein Timeout hat, müsste sie doch vollständig alle Teile der Applikation aufräumen, oder?
Mit Profiling bin ich nicht sonderlich weit gekommen. Den meisten Platz nehmen char[] und byte[] weg (Daher bin ich auf die Strings gekommen) , aber es existieren zu viele Klassen um alles in vernünftiger Zeit zu debuggen. Die Applikation ist nicht von mir entwickelt und hat tausende von Klassen.
Hat irgend jemand eine Idee, woran es liegen könnte, oder mit welcher Methodik ich dem Problem auf den Grund gehen könnte?
Danke schonmal im Vorraus
Ich habe ein Problem mit einem Tomcat-Servlet. Das Servlet an sich verbaucht mit der Zeit immer mehr Speicher. Das eigentliche Problem tritt jedoch auf, wenn die Anwendung beendet wird. Der Speicherverbauch des Tomcats sinkt nicht mehr. Im Tomcat-Manager wird "Free Memory" nicht wesentlich erhöht, wenn die Anwendung beendet wurde. Starte und beende ich die Anwendung mehrere Male, so verliert der Tomcat immer mehr Speicher, bis er schließlich eine OutOfMemoryException wirft.
Ich habe folgende Überlegungen angestellt, woher es kommen könnte:
1. Es werden String + String + String - Kommandos großflächig eingesetzt um SQl-Queries abzufragen. Können die dadurch generierten internal Strings eventuell den Speicher zumüllen. Werden diese Strings bei der JVM 5.0 tatsächlich "nie" aufgeräumt, wie es in manchen Threads zu lesen ist
2. Verbindungen zur Datenbank. Wird die Applikation nicht ordnungsgemäß beendet (einfach Browser-Fenster schließen), wird keine Aufräum-Methode gestartet. Damit bleibt auch die Verbindung zur DB bestehen. Diese sollte doch aber nach einer gewissen Zeit ein Timout bekommen, oder?
3. Context. Wird die Applikation nicht ordnungsgemäß beendet, wird der gesamte Context ja nicht ordentlich aufgeräumt (siehe auch Verbindungen zur Datenbank, der im Context gehalten wird). Wird dieser nie aufgeräumt? Wenn die Session ein Timeout hat, müsste sie doch vollständig alle Teile der Applikation aufräumen, oder?
Mit Profiling bin ich nicht sonderlich weit gekommen. Den meisten Platz nehmen char[] und byte[] weg (Daher bin ich auf die Strings gekommen) , aber es existieren zu viele Klassen um alles in vernünftiger Zeit zu debuggen. Die Applikation ist nicht von mir entwickelt und hat tausende von Klassen.
Hat irgend jemand eine Idee, woran es liegen könnte, oder mit welcher Methodik ich dem Problem auf den Grund gehen könnte?
Danke schonmal im Vorraus
Comment