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.
JDK installiert
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)
(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.
Wenn Sie den gewünschten Prozess gefunden haben, klicken Sie mit der rechten Maustaste und klicken Sie auf Eigenschaften.
Ein Fenster ähnlich dem folgenden wird angezeigt. Überprüfen Sie daher die TID des Threads, der die CPU verbraucht.
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.
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.
Recommended Posts