Identifiez les threads du processus Java qui gaspillent du processeur

Aperçu

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.

Conditions préalables

JDK installé

Pour Linux

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)

Pour les fenêtres

(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.

pe64.png

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.

WS000001.JPG

Une fenêtre similaire à la suivante sera affichée, vérifiez donc le TID du thread qui consomme le CPU.

pe_sub.png

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).

WS000002.JPG

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.

tdh1.png

Recommended Posts

Identifiez les threads du processus Java qui gaspillent du processeur
Divers threads en java
L'histoire que .java est également construite dans Unity 2018
Exécution de processus externe en Java
[Java] Je veux vérifier que les éléments de la liste sont nuls ou vides [Collection Utils]
Implémentons la condition que la circonférence et l'intérieur de la forme Ougi soient inclus dans Java [Partie 2]
Implémentons la condition que la circonférence et l'intérieur de la forme Ougi soient inclus dans Java [Partie 1]
Le problème de la réorganisation arbitraire des attributs XML dans Android Studio
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Exemple de code utilisant JMustache, le moteur de modèles Moustache en Java
Accéder à l'interface réseau avec Java
Devinez le code de caractère en Java
Spécifiez l'emplacement Java dans eclipse.ini
Décompressez le fichier zip en Java
processus thread-safe en java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Quelles sont les règles de JUnit?
Exécuter un processus externe en Java
Appelez la super méthode en Java
Spécifiez l'ordre dans lequel les fichiers de configuration et les classes sont chargés dans Java
Le problème que le contenu des paramètres est complètement affiché dans la vue [Rails]
Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
L'histoire selon laquelle le servlet n'a pas pu être chargé dans l'application Web Java
À propos du phénomène que StackOverflowError se produit lors du traitement à l'aide d'expressions régulières Java
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder
Obtenez le résultat de POST en Java
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
J'ai essayé le nouveau yuan à Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
Essayez d'appeler le service CORBA sur Java 11+
Quelle est la méthode principale en Java?
Quelles sont les fonctionnalités mises à jour de Java 13
Comment obtenir la date avec Java
[Java 7] Divisez la liste Java et exécutez le processus
Traitez n'importe quel nombre de cas dans la liste Java
L'histoire de l'écriture de Java dans Emacs
Entrée de la console en Java (comprendre le mécanisme)
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
Code pour supprimer tous les fichiers du préfixe spécifié dans AWS S3 (Java)
Je ne savais pas que les classes internes pouvaient être définies dans l'interface [Java]
10 barrages de dessin avec ● ou ■ qui sont susceptibles d'apparaître dans la formation (Java)
[Java] Que faire si le contenu enregistré dans la base de données et le nom de l’énumération sont différents dans l’énumération qui reflète la définition de la base de données