Vor einigen Tagen bemerkte ich ein ungewöhnliches Verhalten von einer unserer Tomcat Serverinstanzen. Der Server schien normal zu laufen, aber ein Kern der CPU wurde bereits seit einigen Minuten zu 100% belastet. Die Anwendung war ganz normal erreichbar und auch in der Logausgabe waren keine Unregelmäßigkeiten zu finden. Eine Kopie der Produktivinstanz lief in der Testumgebung problemlos. Es handelte sich also um ein Problem, das erst zur Laufzeit entsteht und nicht mit dem Datenbestand o.ä. zusammenhängt. Ein Neustart würde das Problem wohl beheben – aber tritt es dann eventuell wieder auf? Hat ggf. ein Anwender nur einen sehr umfangreichen Report gestartet und der Server braucht für die Verarbeitung einfach sehr lange oder handelt es sich um einen Bug in der Software?
Für mich stellte sich also die Frage, wie ich nun herausfinde, was der Server dort gerade macht. Ein Neustart kam aber nicht in Frage, da das Problem dann verschwinden würde und eine Fehleranalyse unmöglich wäre.
Eine Recherche im Internet führte mich schneller als erwartet zum Ziel. Das aktuelle Java SDK bringt eine ganze Reihe von Tools zur Überwachung von Javaprozessen mit. Eines dieser Tools nennt sich jstack und zeigt mir den aktuellen Stack aller Threads innerhalb eines Prozesses an. Das schuldige MemoryLeak war schnell gefunden und gefixed. Alles was ich brauchte war also bereits auf dem Server installiert.
Ein Blick auf die JDK Develoment Tools lohnt sich also in jedem Fall. Gerade wenn man keine Möglichkeit mehr hat, ein Monitoring Tool zu installieren oder man sich nicht sicher ist, was da gerade läuft, können einem diese (meist schon vorhanden) Tools weiterhelfen.
(jstack ist wohl leider noch nicht im Windows JDK enthalten. Alternativ kann man dort aber die grafische jconsole verwenden. Auch diese ist im JDK enthalten.)