Identifizieren Sie Threads im Java-Prozess, die CPU verschwenden

Überblick

Hier erfahren Sie, wie Sie Threads identifizieren, die in einem Java-Prozess CPU verschwenden. Es wird nicht nur die Linux-, sondern auch die Windows-Methode veröffentlicht.

Voraussetzungen

JDK installiert

Für Linux

Zunächst die Methode unter Linux. Es wäre schön, wenn das Gleiche unter Windows möglich wäre (siehe unten).

(1) Geben Sie die ID des Ziel-Java-Prozesses mit dem Befehl jps an

$ jps
25830 Jps
25800 EmbeddedJettyServer
25769 Launcher

(2) Verwenden Sie den Befehl top, um den CPU-Nutzungsstatus des Ziel-Java-Prozesses für jeden Thread zu erfassen.

$ top -n 1 -H -p 25800

top - 21:29:39 up 23:36,  3 users,  load average: 1.66, 0.97, 0.52
Tasks:  31 total,   1 running,  30 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.9%us,  0.8%sy,  0.0%ni, 96.2%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3909512k total,  3778736k used,   130776k free,     9520k buffers
Swap:  2031612k total,    52248k used,  1979364k free,   366352k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
 25826 root      20   0 3912m 332m  16m R 95.9  8.7   1:34.14 java                                                                  
 25800 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.00 java                                                                  
 25804 root      20   0 3912m 332m  16m S  0.0  8.7   0:04.61 java                                                                  
 25805 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.59 java                                                                  
 25806 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.01 java                                                                  
 25807 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.02 java                                                                  
 25808 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.00 java                                                                  
 25809 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.00 java                                                                  
 25810 root      20   0 3912m 332m  16m S  0.0  8.7   0:00.00 java          

Im obigen Fall können Sie sehen, dass der Thread mit der PID "25826" 95,9% der CPU verbraucht.

(3) Konvertieren Sie "25826" mit dem folgenden Befehl in hexadezimal.

$ printf %x\\n 25826
64e2

(4) Holen Sie sich mit dem Befehl jstack einen Thread-Dump des Ziel-Java-Prozesses

$ jstack 25800 > thread_dump.txt

(5) Sie können den Thread identifizieren, indem Sie thread_dump.txt mit einem Texteditor öffnen und nach nid = 0x64e2 suchen.

"qtp2122049087-23" #23 prio=5 os_prio=0 tid=0x00007f5368f2b000 nid=0x64e2 runnable [0x00007f53a06b7000]
   java.lang.Thread.State: RUNNABLE
        at org.apache.log4j.Category.getEffectiveLevel(Category.java:442)
        at org.apache.log4j.Category.isDebugEnabled(Category.java:736)
        at org.slf4j.impl.Log4jLoggerAdapter.debug(Log4jLoggerAdapter.java:250)
        at org.t246osslab.easybuggy.troubles.InfiniteLoopServlet.doGet(InfiniteLoopServlet.java:24)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1507)
        at org.t246osslab.easybuggy.core.filters.AuthenticationFilter.doFilter(AuthenticationFilter.java:72)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1495)
        at org.t246osslab.easybuggy.core.filters.SecurityFilter.doFilter(SecurityFilter.java:51)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1495)
        at org.t246osslab.easybuggy.core.filters.EncodingFilter.doFilter(EncodingFilter.java:42)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1487)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)

Für Windows

(1) Geben Sie die ID des Ziel-Java-Prozesses mit dem Befehl jps an

> jps
9488 Jps
5256 Launcher
3948 EmbeddedJettyServer

(2) Verwenden Sie den Prozess-Explorer, um den CPU-Nutzungsstatus des Ziel-Java-Prozesses für jeden Thread zu verstehen.

Verwenden Sie unter Windows ohne den Befehl top ein Tool namens Process Explorer (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx). Laden Sie einfach die exe-Datei herunter und klicken Sie darauf, um sie zu starten.

pe64.png

Wenn Sie den gewünschten Prozess gefunden haben, klicken Sie mit der rechten Maustaste und klicken Sie auf Eigenschaften.

WS000001.JPG

Ein Fenster ähnlich dem folgenden wird angezeigt. Überprüfen Sie daher die TID des Threads, der die CPU verbraucht.

pe_sub.png

Im obigen Fall können Sie sehen, dass der Thread mit der PID "9292" 26,47% der CPU verbraucht.

(3) Konvertieren Sie "9292" mit einem Funktionsrechner (weil es Windows ist) in hexadezimal.

WS000002.JPG

Die Hexadezimalzahl von "9292" ist 244c.

(4) Holen Sie sich mit dem Befehl jstack einen Thread-Dump des Ziel-Java-Prozesses

> jstack 3948 > thread_dmup.txt

(5) Öffnen Sie die Ausgabedatei (thread_dmup.txt) und suchen Sie nach nid = 0x244c, um den Thread zu identifizieren.

tdh1.png

Recommended Posts

Identifizieren Sie Threads im Java-Prozess, die CPU verschwenden
Verschiedene Threads in Java
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
Externe Prozessausführung in Java
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
Implementieren wir die Bedingung, dass der Umfang und das Innere der Ougi-Form in Java enthalten sind [Teil 2]
Implementieren wir die Bedingung, dass der Umfang und das Innere der Ougi-Form in Java enthalten sind [Teil 1]
Das Problem, dass XML-Attribute in Android Studio willkürlich neu angeordnet werden
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Beispielcode mit JMustache, der Moustache-Vorlagen-Engine in Java
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Errate den Zeichencode in Java
Geben Sie den Java-Speicherort in eclipse.ini an
Entpacken Sie die Zip-Datei in Java
Thread-sicherer Prozess in Java-Sprache
Analysieren der COTOHA-API-Syntaxanalyse in Java
Was sind die Regeln in JUnit?
Führen Sie einen externen Prozess in Java aus
Rufen Sie die Super-Methode in Java auf
Geben Sie die Reihenfolge an, in der die Konfigurationsdateien und Klassen in Java geladen werden
Das Problem, dass der Inhalt von Parametern vollständig in der Ansicht [Rails] angezeigt wird
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
Die Geschichte, dass das Servlet nicht in die Java-Webanwendung geladen werden konnte
Über das Phänomen, dass StackOverflowError bei der Verarbeitung mit regulären Java-Ausdrücken auftritt
[Java] Implementieren Sie eine Funktion, die eine im Builder-Muster implementierte Klasse verwendet
Holen Sie sich das Ergebnis von POST in Java
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Was ist die Hauptmethode in Java?
Was sind die aktualisierten Funktionen von Java 13
So erhalten Sie das Datum mit Java
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Verarbeiten Sie eine beliebige Anzahl von Fällen in Java List
Die Geschichte des Schreibens von Java in Emacs
Konsoleneingabe in Java (Verständnis des Mechanismus)
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
Code zum Löschen aller Dateien mit dem angegebenen Präfix in AWS S3 (Java)
Ich wusste nicht, dass innere Klassen in der [Java] -Schnittstelle definiert werden können
10 Sperrfeuer mit ● oder ■, die wahrscheinlich im Training auftreten (Java)
[Java] Was tun, wenn sich der in der Datenbank gespeicherte Inhalt und der Name der Aufzählung in der Aufzählung unterscheiden, die die Definition der Datenbank widerspiegelt?