Frage

Eines Tages erreicht unsere Java-Webanwendung eine CPU-Auslastung von 100%. Ein Neustart löst den Vorfall, aber nicht das Problem, da einige Stunden nach dem Problem erneut aufgetreten ist. Wir haben eine Endlosschleife vermutet, die durch eine neue Version eingeführt wurde, aber wir haben keine Änderungen am Code oder am Server vorgenommen.

Wir haben es geschafft, das Problem zu finden, indem wir mit kill -QUIT mehrere Thread-Dumps erstellt und alle Thread-Details untersucht und verglichen haben. Wir haben festgestellt, dass ein Thread-Aufrufstapel in allen Thread-Dumps angezeigt wird. Nach der Analyse gab es eine while-Schleifenbedingung, die für einige Daten, die regelmäßig in der Datenbank aktualisiert wurden, niemals falsch wird.

Die Analyse mehrerer Thread-Dumps von Webanwendungen ist sehr mühsam.

Kennen Sie also einen besseren Weg oder bessere Tools, um ein solches Problem in einer Produktionsumgebung zu finden?

War es hilfreich?

Lösung

Nach einigen Fragen fand ich eine Antwort in Überwachen und Verwalten von Java SE 6-Plattformanwendungen :

Sie können einen Schleifenthread mithilfe des von JDK bereitgestellten Tools JTop diagnostizieren, das die CPU-Zeit anzeigt, die jeder Thread verwendet:  Geben Sie hier die Bildbeschreibung ein

Mit dem Thread-Namen finden Sie die Stapelverfolgung dieses Threads auf der Registerkarte "Threads" von, indem Sie einen Thread-Dump mit einem kill -QUIT erstellen.

Sie können sich jetzt auf den Code konzentrieren, der die Endlosschleife verursacht.

PS.: Es scheint in Ordnung zu sein, meine eigene Frage gemäß http: / zu beantworten. /blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] "Ja, es ist in Ordnung und sogar ermutigt, Ihre eigenen Fragen zu beantworten, wenn Sie vor allen anderen eine gute Antwort finden." […]

PS.: Falls die Domain sun.com nicht mehr existiert: Sie können JTop als eigenständige Benutzeroberfläche ausführen:

$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar

Alternativ können Sie es als JConsole-Plug-In ausführen:

$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar 

Andere Tipps

Beheben Sie das Problem, bevor es auftritt!Verwenden Sie ein statisches Analysetool wie FindBugs oder PMD als Teil Ihres Build-Systems.Es wird nicht alles gefunden, aber es ist ein guter erster Schritt.

Denken Sie daran, Coverage-Tools wie Cobertura zu verwenden. Es hätte Ihnen gezeigt, dass Sie diese Codepfade nicht getestet haben.

etw. testenDies kann sehr umständlich werden. Versuchen Sie daher, dies zu vermeiden, indem Sie Qualitätsmessungen einführen.

Tools wie VisualVM geben Ihnen jedenfalls einen schönen Überblick über alle Threads, sodass es relativ einfach wird, Threads zu identifizieren, die unerwartet lange funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top