Hohe CPU-Auslastung in Java-Anwendungen - warum?
Ich habe eine Java-Anwendung (web-basiert), dass in Zeiten, zeigt sehr hohe CPU-Auslastung (fast 90%) für mehrere Stunden. Linux TOP
Befehl zeigt dies. Auf Anwendung neu starten, verschwindet das problem.
So zu untersuchen:
Ich nehmen Thread-Dump zu finden, welche threads zu tun. Mehrere Threads gefunden in 'RUNNABLE'
Zustand, einige nur in wenigen anderen Staaten. Auf die Einnahme wiederholte Thread-Dumps, sehe ich einige threads, die immer vorhanden sind, in 'RUNNABLE'
Zustand. So, Sie zu sein scheinen die Täter.
Aber ich bin nicht in der Lage zu sagen, sicher, welcher Thread in Beschlag, der CPU und hat sich in eine Endlosschleife (der dadurch verursacht hohe CPU-util).
Logs nicht unbedingt helfen, da die fehlerhaften code kann nicht anmelden, nichts.
Wie kann ich ermitteln, welcher Teil der Anwendung oder was-thread ist, verursachen Hohe CPU-Auslastung? - Irgendwelche anderen Ideen?
InformationsquelleAutor der Frage Jasper | 2013-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein profiler ist nicht anwendbar in Ihrem setup haben, können Sie versuchen, zu identifizieren, der thread folgende Schritte in dieser Beitrag.
Grundsätzlich gibt es drei Schritte:
top -H
bekommen und PID der thread mit der höchsten CPU.InformationsquelleAutor der Antwort ericson
Möglicherweise werden Sie Opfer eines garbage-collection-problem.
Wenn Ihre Anwendung erfordert Speicher und es wird immer geringer, was es so konfiguriert, dass der garbage collector ausgeführt wird oft die verbrauchen viel CPU-Zyklen.
Wenn es nicht sammeln alles, was Ihr Speicher wird niedrig bleiben, so wird es laufen, wieder und wieder.
Beim bereitstellen Ihrer Anwendung wird der Speicher gelöscht und die garbage collection wird nicht passieren mehr, als benötigt, damit die CPU-Auslastung bleibt niedrig, bis es wieder voll.
Sollten Sie überprüfen, dass es keine memory-leak in der Anwendung und, dass er gut konfiguriert für Speicher (prüfen Sie die
-Xmx
parameter, siehe Was bedeutet die Java-option -Xmx stehen?)Auch, was verwenden Sie als web-framework? JSF setzt viel auf sessions und verbraucht eine Menge Speicher, sollten zustandslos ist bei den meisten!
InformationsquelleAutor der Antwort Alexandre Jacob
Während dieser peak-CPU-Zeiten, was die user laden wie? Sie sagen, das ist eine web-basierte Anwendung, so dass die Täter in den Sinn kommen, ist die Speicher-Auslastung Probleme. Wenn Sie speichern eine Menge Sachen, die in der Sitzung, zum Beispiel, und die Anzahl der Sitzung wird hoch genug, der app-server wird gestartet Prügel über. Dies ist auch ein Fall, wo das GC könnte noch schlimmer machen, je nach dem Schema, das Sie verwenden. Mehr Informationen über die app und der server-Konfiguration wäre hilfreich, in Richtung auf mehr debugging-Ideen.
InformationsquelleAutor der Antwort WPrecht
Dein Erster Ansatz sollte sein, zu finden, alle Verweise auf Thread.schlafen und überprüfen Sie, dass:
Schlafen, ist die richtige Sache zu tun - sollten Sie irgendeine Art von wait-Mechanismus wenn möglich - vielleicht ist die sorgfältige Verwendung von ein
BlockingQueue
helfen würde.Wenn schlafen ist das richtige zu tun, werden Sie das schlafen für die richtige Höhe der Zeit - das ist oft eine sehr schwierige Frage zu beantworten.
Der häufigste Fehler in der multi-threaded-design ist zu glauben, dass alles, was Sie tun müssen, wenn Sie darauf warten, dass etwas passiert, ist der check für Sie und schlafen Sie für eine Weile in einer engen Schleife. Dies ist nur selten eine effektive Lösung - man sollte immer versuchen zu
wait
für das auftreten.Die zweite häufigste Problem ist die Schleife ohne zu schlafen. Das ist noch schlimmer und wird ein wenig weniger leicht aufspüren.
InformationsquelleAutor der Antwort OldCurmudgeon
In der thread-dump finden Sie die Nummer der Zeile, wie unten gezeigt.
für den Haupt-thread die momentan läuft...
InformationsquelleAutor der Antwort ranafeb14