Wenn Sie eine Java-Anwendung, die CPU verbraucht, wenn es nichts zu tun, wie Sie bestimmen, was es tut?

stimmen
12

Ich bin ein Anbieter Java API aufrufen, und auf einigen Servern scheint es, dass die JVM geht in eine niedrige Priorität Abfrageschleife, nachdem sie in der API (bei 100% CPU-Auslastung) anzumelden. Die gleiche Anwendung auf anderen Servern dieses Verhalten nicht zeigen. Dies geschieht auf WebSphere und Tomcat. Die Umwelt ist schwierig einzurichten, so dass es schwierig ist, zu versuchen, etwas wie Profilierung innerhalb von Eclipse zu tun.

Gibt es eine Möglichkeit (oder ein anderes Verfahren zum Inspizieren) eine vorhandene Java-Anwendung läuft in Tomcat zu profilieren, um herauszufinden, welche Methoden ausgeführt werden, während es in dieser spinwait Art von Zustand ist? Die Anwendung ausgeführt wird nur eine Methode, wenn sie in diesem Zustand (Vendor-Methode) erhält. Der Anbieter kann das Verhalten nicht replizieren (natürlich).


Aktualisieren:

Mit JConsole konnte ich bestimmen, wer lief und was sie taten. Es dauerte ein paar Stunden, um dann herauszufinden, warum sie es tat. Das Problem war dann aber, dass der API jar des Anbieters, die benutzt wurde, um nicht gerade Konfiguration in der die Datenbank ergab, dass es wurde mit. Es wurde säumige Verfolgung und Leistungsüberwachung auf den Servern aktiviert hat, die die leichte Fehlanpassung in der Konfiguration hatte. Ich habe ein anderes Glas und alles ist gut.

Also vielen Dank, Joshua, für deine Antwort. JConsole war sehr einfach einzurichten und zu verwenden, um eine bestehende Anwendung zu überwachen.

@Cringe - Ich habe mit einigen der Optionen etwas experimentieren Sie vorgeschlagen. Ich hatte ein paar Probleme mit dem Erhalten JProfiler eingerichtet, es sieht gut aus (aber teuer). In Zukunft ging ich weiter und die Eclipse-Profiler-Plugin hinzugefügt und ich werde über die verschiedenen Open-Source-Profiler suchen werde Funktionalität zu vergleichen.

Veröffentlicht am 16/08/2008 um 01:45
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
15

Wenn Sie mit Java 5 oder höher, können Sie für Ihre Anwendung eine Verbindung mit jconsole alle laufenden Threads anzuzeigen. jstack auch einen Stack Dump tun. Ich denke , dies noch einmal in einem Container wie Tomcat funktionieren soll.

Beide Tools mit JDK5 enthalten sind und später (ich nehme das Verfahren mindestens sein muss Java 5, obwohl ich falsch sein könnte)

Update: Es ist auch erwähnenswert, dass mit JDK 1.6 Update starten 7 gibt es nun eine gebündelte Profiler genannt VisualVM , die mit ‚jvisualvm‘ ins Leben gerufen werden kann. Es sieht aus wie es ist java.net Projekt , so zusätzliche Informationen zu dieser Seite verfügbar. Ich habe dies noch nicht benutzt , aber es sieht für ernstere Analyse nützlich.

Ich hoffe, das hilft

Beantwortet am 16/08/2008 um 03:12
quelle vom benutzer

stimmen
6

Mit Blick auf das gleiche Problem habe ich YourKit Profiler . Es ist Loader wird nicht aktiviert , wenn Sie es tatsächlich eine Verbindung (obwohl es einen Port öffnet für Verbindungen zu hören). Der Profiler selbst hat eine schöne „viel Zeit in jeder Methode ausgegeben bekommen“ , während die in sie ist weniger aufdringliche Modus.

Eine weitere Möglichkeit ist die CPU - Auslastung zu erfassen (über JNI, so würden Sie eine externe Bibliothek dafür brauchen) in einem „Watchdog“ Thread mit der höchsten Priorität und starten alle Themen Protokollierung , wenn die CPU hoch genug für eine ausreichend lange Zeit ist. Vielleicht finden Sie diesen Artikel enlightining.

Beantwortet am 16/08/2008 um 19:26
quelle vom benutzer

stimmen
2

JRockit Mission Control Latency Analyzer.

Der Latency Analyzer, der mit JRockit kommt zeigt Ihnen, was die JVM „tun“, wenn es nichts zu tun. In der neuesten Version können Sie Latenzen sehen für:

  • Java Warte / blockiert / Schlaf / geparkt.
  • Datei-I / O
  • Netzwerk-I / O
  • Speicherzuweisung
  • GC Pausen
  • JVM Latenzen, zB Codegenerierung und das Laden von Klassen
  • Fadenaufhängung

Das Tool gibt Ihnen den Stack-Trace, wenn die Latenzzeit aufgetreten ist. Sie können die Latenz Daten auf viele verschiedene Arten (aggregierte Spuren, als ein Histogramm, in einem Thread Graphen etc.) anzuzeigen. Das Werkzeug ermöglicht es Ihnen auch Übergänge zwischen den Threads zu sehen, zum Beispiel, wenn ein Thread eines anderen mitteilt.

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

Der Aufwand ist gering und im Gegensatz zu vielen anderen Werkzeugen kann es in einer Produktionsumgebung eingesetzt werden. Diese Blog - Post gibt Ihnen eine kurze Einführung und das Programm kann heruntergeladen werden hier .

Es ist kostenlos für die Entwicklung nutzen zu können!

Beantwortet am 29/09/2008 um 22:00
quelle vom benutzer

stimmen
2

Wenn JConsole Sie nicht verwendet werden können, können

  • Presse CTRL+ BREAKunter Windows
  • Bitte senden Sie kill -3 <process id>unter Linux

ein vollständigen Thread-Dump zu erhalten. Dies gilt nicht die Leistung beeinträchtigt und kann immer in der Produktion ausgeführt werden.

Beantwortet am 23/08/2008 um 09:22
quelle vom benutzer

stimmen
2

Wenn es für professionelle Zwecke ist , und Sie haben etwas Geld ausgeben, versuchen Sie Ihre Hände zu bekommen JProfiler . Wenn Sie nur einen Einblick zu bekommen, versuchen , die aus Eclipse - Profiler Plugin . Ich habe es mehrmals, aber ich weiß nicht , den aktuellen Zustand.

(?) Ein neues Projekt aus dem Eclipse - Projekt selbst zu Verfügung: http://www.eclipse.org/tptp/ (Siehe diesen Artikel ). Nie benutzt, so kann ich nicht sagen , ob es die Mühe wert ist.

Es gibt auch eine sehr gute Liste des Open - Source - Profilometer verfügbar bei http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Beantwortet am 16/08/2008 um 06:40
quelle vom benutzer

stimmen
1

Verwenden Sie einen Profiler. Ja , sie kosten Geld, und mit ihnen gelegentlich ein wenig umständlich sein kann, aber sie Sie liefern mit sehr viel mehr echte Beweise statt Vermutungen.

Die Menschen sind allgemein schlecht erraten , wo Performance - Engpässe sind. Es scheint nur etwas unser Gehirn sehr gut zu tun , baut nicht zu sein. Es mag offensichtlich erscheinen, können Sie große Ideen haben , was das Problem ist, aber die wirkliche Welt dreht sich oft anders , etwas zu tun sein wird. Und den falschen Teil des Codes zu optimieren bedeutet, im besten Fall , viel Arbeit für geringen Nutzen. Häufiger macht es die Dinge langsamer, und manchmal bricht es Dinge völlig. Also , bevor Sie Änderungen im Interesse der Optimierung machen, sollen Sie immer haben echte Beweise von einem Profiler oder anderem präzisem Werkzeug.

Wie bereits erwähnt, sind beide JProfiler und YourKit beide ziemlich gut und nicht zu teuer. Als ich das letzte Mal sah, sie beide zu kostenlose Demos hatte.

Beantwortet am 21/08/2008 um 13:49
quelle vom benutzer

stimmen
0

VisualVM sollte der Profiler von Netbeans als eigenständige sein. Ich versuchte, die TPTP für Eclipse aber VisualVM scheint als viel schöne Option!

Beantwortet am 21/08/2008 um 12:51
quelle vom benutzer

stimmen
0

Der Vollständigkeit halber: Auch wenn mein Unternehmen mehr oder weniger standardisiert auf Eclipse wir Netbeans verwenden ( ab 6 Jahren) mit eingeschlossen, frei Profiler auf einer täglichen Basis. Es funktioniert besser als Eclipse - Plugin TPTP (zuletzt vor 3 Monaten überprüft) und für uns entfernt es keine Notwendigkeit für einen kommerziellen Profiler wie JProfiler, das ist ausgezeichnet, aber schnell zu unnötig.

Beantwortet am 19/08/2008 um 19:50
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more