Voici comment identifier les threads qui gaspillent du processeur dans un processus Java. Non seulement la méthode Linux mais aussi Windows est publiée.
JDK installé
Tout d'abord, la méthode sous Linux. Ce serait bien si la même chose pouvait être faite sous Windows (voir ci-dessous).
(1) Spécifiez l'ID du processus Java cible avec la commande jps
$ jps
25830 Jps
25800 EmbeddedJettyServer
25769 Launcher
(2) Utilisez la commande top pour saisir l'état d'utilisation du processeur du processus Java cible pour chaque thread.
$ 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
Dans le cas ci-dessus, vous pouvez voir que le thread avec le PID "25826" consomme 95,9% du CPU.
(3) Convertissez "25826" en hexadécimal avec la commande suivante.
$ printf %x\\n 25826
64e2
(4) Obtenez un vidage de thread du processus Java cible avec la commande jstack
$ jstack 25800 > thread_dump.txt
(5) Vous pouvez identifier le fil en ouvrant thread_dump.txt avec un éditeur de texte et en recherchant nid = 0x64e2.
"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) Spécifiez l'ID du processus Java cible avec la commande jps
> jps
9488 Jps
5256 Launcher
3948 EmbeddedJettyServer
(2) Utilisez Process Explorer pour comprendre l'état d'utilisation du processeur du processus Java cible pour chaque thread.
Sous Windows sans la commande supérieure, utilisez un outil appelé Process Explorer (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx). Il suffit de télécharger et de cliquer sur le fichier exe pour le lancer.
Une fois que vous avez trouvé le processus que vous recherchez, cliquez avec le bouton droit de la souris et cliquez sur Propriétés.
Une fenêtre similaire à la suivante sera affichée, vérifiez donc le TID du thread qui consomme le CPU.
Dans le cas ci-dessus, vous pouvez voir que le thread avec le PID "9292" consomme 26,47% du CPU.
(3) Convertissez "9292" en hexadécimal avec une calculatrice de fonction (car il s'agit de Windows).
Le nombre hexadécimal de «9292» est 244c.
(4) Obtenez un vidage de thread du processus Java cible avec la commande jstack
> jstack 3948 > thread_dmup.txt
(5) Ouvrez le fichier de sortie (thread_dmup.txt) et recherchez nid = 0x244c pour identifier le thread.
Recommended Posts