3 Stimmen

Tomcat beschwert sich, dass ein Thread nicht angehalten wird

Ich erhalte Ausnahmeregelungen für Themen, die gestartet, aber nicht beendet oder gestoppt werden. Der WebappClassLoader beschwert sich, dass diese Threads ein Speicherleck verursachen.

Was ist hier los?

  1. Ist es wahrscheinlich, dass solche Threads ein Speicherleck verursachen? Oder nur möglich?
  2. Ist Catalina übermäßig empfindlich?
  3. Ist dies überhaupt eine gültige Programmiertechnik?

(Die Verwaltung dieses Aspekts einer Tomcat-Anwendung ist für mich neu. Aber ich muss es lernen, da der Webapplikation bei hoher Last die Datenbankverbindungen ausgehen und dies gelöst werden muss. Die Suche nach Speicherlecks ist eines von vielen Dingen, die wir untersuchen).

3voto

Emil Sit Punkte 21922

Sie können über schwierige Probleme mit Speicherlecks in Tomcat (und diese Warnung im Besonderen) lesen unter http://wiki.apache.org/tomcat/MemoryLeakProtection -- insbesondere für die Warnung, die Sie sehen:

Wenn eine Webapplikation einen Thread erstellt, wird dessen Kontext-Classloader standardmäßig auf den des Eltern-Threads (der Thread, der den neuen Thread erstellt hat) gesetzt. In einer Webapp ist dieser übergeordnete Thread einer der Tomcat-Worker-Threads, dessen Kontext-Classloader auf den Webapp-Classloader gesetzt wird, wenn er Webapp-Code ausführt.

Darüber hinaus kann der gespawnte Thread einen Code ausführen (oder darin blockiert sein), der von der Webapp geladene Klassen beinhaltet, wodurch verhindert wird, dass der Classloader der Webapp gesammelt wird.

Wenn also der gespawnte Thread nicht ordnungsgemäß beendet wird, wenn die Anwendung gestoppt wird, wird der Webapp-Klassenlader aufgrund der starken Referenz, die der gespawnte Thread hält, undicht.

Meiner Erfahrung nach wirkt sich dies nur begrenzt aus, wenn Sie Ihre Webanwendung einmal starten und dann einfach wieder abbauen. In einigen Fällen jedoch, z. B. in einem kontinuierlichen Integrationsszenario (in dem Ihr CI-Server wiederholt Builds Ihrer Anwendung in einem Tomcat-Container bereitstellt, der nicht neu gestartet wird), kann der Speicher in der JVM schnell erschöpft sein. Dies äußert sich schließlich in einem OutOfMemoryException in Ihrer PermGen-Region (vorausgesetzt, Sie verwenden die Sun/Oracle JVM). Weitere Einzelheiten zu PermGen finden Sie unter http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X