Wenn Sie eine Java-Anwendung haben, die CPU verbraucht, obwohl sie nichts tut, wie können Sie dann feststellen, was sie tut?

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Frage

Ich rufe die Java-API eines Anbieters auf und auf einigen Servern scheint es, dass die JVM nach der Anmeldung bei der API in eine Abfrageschleife mit niedriger Priorität gerät (CPU bei 100 % Auslastung).Dieselbe App auf anderen Servern zeigt dieses Verhalten nicht.Dies geschieht auf WebSphere und Tomcat.Die Umgebung ist schwierig einzurichten, daher ist es schwierig, so etwas wie Profilerstellung in Eclipse durchzuführen.

Gibt es eine Möglichkeit, ein Profil (oder eine andere Methode zur Überprüfung) einer vorhandenen Java-App zu erstellen, die in Tomcat ausgeführt wird, um herauszufinden, welche Methoden ausgeführt werden, während sie sich in diesem Spinwait-Zustand befindet?Die App führt in diesem Zustand nur eine Methode aus (Methode des Anbieters).Der Anbieter kann das Verhalten (natürlich) nicht reproduzieren.


Aktualisieren:

Mit JConsole konnte ich feststellen, wer lief und was sie taten.Es dauerte ein paar Stunden, bis ich dann herausgefunden hatte, warum es so war.Das Problem bestand letztendlich darin, dass das verwendete API-JAR des Anbieters nicht genau mit der verwendeten Datenbankkonfiguration übereinstimmte.Standardmäßig war die Ablaufverfolgung und Leistungsüberwachung auf den Servern aktiviert, bei denen es zu leichten Abweichungen in der Konfiguration kam.Ich habe ein anderes Glas verwendet und alles ist gut.

Vielen Dank, Joshua, für deine Antwort.JConsole war äußerst einfach einzurichten und zur Überwachung einer vorhandenen Anwendung zu verwenden.

@Cringe – Ich habe mit einigen der von Ihnen vorgeschlagenen Optionen experimentiert.Ich hatte einige Probleme mit der Einrichtung von JProfiler, es sieht gut aus (aber teuer).In Zukunft habe ich das Eclipse Profiler-Plugin hinzugefügt und werde mir die verschiedenen Open-Source-Profiler ansehen, um die Funktionalität zu vergleichen.

War es hilfreich?

Lösung

Wenn Sie Java 5 oder höher verwenden, können Sie über eine Verbindung zu Ihrer Anwendung herstellen jconsole um alle laufenden Threads anzuzeigen.jstack führt auch einen Stack-Dump durch.Ich denke, das sollte auch in einem Container wie Tomcat noch funktionieren.

Beide Tools sind in JDK5 und höher enthalten (ich gehe davon aus, dass der Prozess mindestens Java 5 sein muss, obwohl ich mich irren könnte)

Aktualisieren:Es ist auch erwähnenswert, dass es ab JDK 1.6 Update 7 nun einen gebündelten Profiler namens gibt VisualVM welches mit „jvisualvm“ gestartet werden kann.Es sieht so aus, als wäre es ein java.net-Projekt, sodass möglicherweise zusätzliche Informationen auf dieser Seite verfügbar sind.Ich habe dies noch nicht verwendet, aber es scheint für eine ernsthaftere Analyse nützlich zu sein.

Ich hoffe, das hilft

Andere Tipps

Ich stehe vor dem gleichen Problem, das ich verwendet habe YourKit-Profiler.Der Loader wird erst aktiviert, wenn Sie tatsächlich eine Verbindung herstellen (obwohl er einen Port öffnet, um auf Verbindungen zu warten).Der Profiler selbst verfügt über eine schöne „Ermittlung der für jede Methode aufgewendeten Zeit“, während er in seinem weniger aufdringlichen Modus arbeitet.

Eine andere Möglichkeit besteht darin, die CPU-Auslastung (über JNI, daher benötigen Sie hierfür eine externe Bibliothek) in einem „Watchdog“-Thread mit höchster Priorität zu erkennen und mit der Protokollierung aller Threads zu beginnen, wenn die CPU über einen ausreichend langen Zeitraum hoch genug ist.Vielleicht finden Sie es Dieser Artikel aufschlussreich.

Wenn es beruflichen Zwecken dient und Sie etwas Geld zum Ausgeben haben, versuchen Sie, es in die Finger zu bekommen JProfiler.Wenn Sie einfach nur ein paar Einblicke gewinnen möchten, probieren Sie es aus Eclipse Profiler-Plugin.Ich habe es mehrmals verwendet, kenne aber den aktuellen Stand nicht.

Ein neues(?) Projekt aus dem Eclipse-Projekt selbst ist ebenfalls verfügbar: http://www.eclipse.org/tptp/ (Sehen Dieser Artikel).Ich habe es noch nie benutzt, daher kann ich nicht sagen, ob sich die Mühe lohnt.

Es gibt auch eine sehr gute Liste von Open-Source-Profilern unter http://www.manageability.org/blog/stuff/open-source-profilers-for-java

JRockit Mission Control Latenzanalysator.

Der mit JRockit gelieferte Latenzanalysator zeigt Ihnen, was die JVM „macht“, wenn sie nichts tut.In der neuesten Version können Sie Latenzen sehen für:

  • Java wartet/blockiert/schläft/parkt.
  • Datei-E/A
  • Netzwerk-E/A
  • Speicherzuweisung
  • GC macht eine Pause
  • JVM-Latenzen, z. B. Codegenerierung und Klassenladen
  • Fadenaufhängung

Das Tool zeigt Ihnen den Stack-Trace an, wann die Latenz aufgetreten ist.Sie können die Latenzdaten auf viele verschiedene Arten anzeigen (aggregierte Spuren, als Histogramm, in einem Thread-Diagramm usw.).Mit dem Tool können Sie auch Übergänge zwischen Threads sehen, beispielsweise wenn ein Thread einen anderen benachrichtigt.

Latenzanalysator http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

Der Overhead ist vernachlässigbar und im Gegensatz zu vielen anderen Tools kann es in einer Produktionsumgebung verwendet werden.Das Blogeintrag gibt Ihnen eine kurze Einführung und das Programm kann heruntergeladen werden Hier.

Die Nutzung für die Entwicklung ist kostenlos!

Wenn JConsole nicht verwendet werden kann, können Sie dies tun

  • Drücken Sie STRG+BRECHEN unter Windows
  • schicken kill -3 <process id> unter Linux

um einen vollständigen Thread-Dump zu erhalten.Dies hat keinen Einfluss auf die Leistung und kann jederzeit in der Produktion ausgeführt werden.

Verwenden Sie einen Profiler. Ja, sie kosten Geld, und ihre Verwendung kann manchmal etwas umständlich sein, aber sie liefern Ihnen viel mehr echte Beweise als Vermutungen.

Menschen sind allgemein schlecht darin, Leistungsengpässe einzuschätzen.Es scheint einfach etwas zu sein, für das unser Gehirn nicht besonders gut geeignet ist.Es mag offensichtlich erscheinen, Sie haben vielleicht gute Vorstellungen davon, wo das Problem liegt, aber in der realen Welt sieht es oft anders aus.Und die Optimierung des falschen Teils des Codes bedeutet im besten Fall viel Arbeit bei minimalem Nutzen.In den meisten Fällen verlangsamt es die Dinge und manchmal bringt es die Dinge völlig zum Erliegen.Bevor Sie also Änderungen zur Optimierung vornehmen, sollten Sie dies tun stets über echte Beweise von einem Profiler oder einem anderen genauen Tool verfügen.

Wie bereits erwähnt, sind sowohl JProfiler als auch YourKit recht gut und nicht übermäßig teuer.Als ich das letzte Mal nachgeschaut habe, hatten beide auch kostenlose Demos.

Der Vollständigkeit halber:Obwohl mein Unternehmen mehr oder weniger auf Eclipse standardisiert, verwenden wir Netbeans (6 und höher) damit inklusive, kostenloser Profiler täglich.Es funktioniert besser als das Eclipse TPTP-Plugin (zuletzt vor 3 Monaten überprüft) und macht für uns die Notwendigkeit eines kommerziellen Profilers wie JProfiler überflüssig, was ausgezeichnet ist, aber schnell überflüssig wird.

VisualVM sollte der eigenständige Profiler von Netbeans sein.Ich habe TPTP für Eclipse ausprobiert, aber visualVm scheint eine viel bessere Option zu sein!

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