Commande pour vérifier le nombre et l'état des threads Java

Lors de la maintenance et de l'exploitation d'un serveur d'applications Java, vous souhaiterez peut-être connaître le nombre et l'état des threads en cours d'exécution. Je pense qu'un serveur d'applications Java général est livré avec une sorte de fonction de vérification de l'état, mais selon la situation, une telle fonction peut ne pas être disponible. Comment puis-je connaître le nombre et l'état des threads dans une telle situation?

Exemple

Le Server.java suivant est un programme qui imite un serveur d'applications Java et crée trois threads enfants.

Server.java


import java.util.ArrayList;
import java.util.List;

public class Server{
    public static void main(String[] args) throws InterruptedException {
        //Fourchez 3 fils enfants.
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 3	; i++) {
            Thread thread = new Thread(() -> sleepForever());
            thread.start();
            threads.add(thread);
        }

        //Mettez le thread parent lui-même en veille.
        sleepForever();
    }

    private static void sleepForever() {
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Compilez-le et exécutez-le.

$ java Server &
[1] 404

(1) jstack

Si vous voulez connaître le nombre et l'état des threads, jstack est probablement le meilleur. jstack est une commande fournie avec le JDK, donc si vous avez un système qui utilise un serveur d'applications Java, vous devriez pouvoir l'utiliser dans de nombreux cas.

Voici un exemple d'exécution de jstack. Vous pouvez voir qu'en plus du thread principal et de ses threads enfants Thread-0`` Thread-1`` Thread-2, l'état de certains threads utilisés par jvm est affiché avec la trace de la pile.

$ jstack 404
2019-12-26 00:06:09
Full thread dump OpenJDK 64-Bit Server VM (11.0.4+11-post-Ubuntu-1ubuntu218.04.3 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007f6a280029d0, length=13, elements={
0x00007f6a74011800, 0x00007f6a74165000, 0x00007f6a74167000, 0x00007f6a7416f800,
0x00007f6a74171800, 0x00007f6a74174000, 0x00007f6a74176000, 0x00007f6a741d8800,
0x00007f6a741e2000, 0x00007f6a741f1800, 0x00007f6a741f3800, 0x00007f6a741f5000,
0x00007f6a28001000
}

"main" #1 prio=5 os_prio=0 cpu=90.00ms elapsed=496.33s tid=0x00007f6a74011800 nid=0x195 waiting on condition  [0x00007f6a7b56f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep([email protected]/Native Method)
        at Server.sleepForever(Server.java:20)
        at Server.main(Server.java:15)

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.00ms elapsed=496.30s tid=0x00007f6a74165000 nid=0x19c waiting on condition  [0x00007f6a58adf000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method)
        at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:213)

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.00ms elapsed=496.30s tid=0x00007f6a74167000 nid=0x19d in Object.wait()  [0x00007f6a589cf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait([email protected]/Native Method)
        - waiting on <0x000000074e50a2c8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x000000074e50a2c8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run([email protected]/Finalizer.java:170)

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=496.29s tid=0x00007f6a7416f800 nid=0x19e runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=10.00ms elapsed=496.29s tid=0x00007f6a74171800 nid=0x19f waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #8 daemon prio=9 os_prio=0 cpu=30.00ms elapsed=496.29s tid=0x00007f6a74174000 nid=0x1a0 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #9 daemon prio=9 os_prio=0 cpu=10.00ms elapsed=496.29s tid=0x00007f6a74176000 nid=0x1a1 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #10 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=496.27s tid=0x00007f6a741d8800 nid=0x1a2 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #11 daemon prio=8 os_prio=0 cpu=0.00ms elapsed=496.26s tid=0x00007f6a741e2000 nid=0x1a4 in Object.wait()  [0x00007f6a17fef000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait([email protected]/Native Method)
        - waiting on <0x000000074e416e98> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x000000074e416e98> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:148)
        at java.lang.Thread.run([email protected]/Thread.java:834)
        at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:134)

"Thread-0" #12 prio=5 os_prio=0 cpu=0.00ms elapsed=496.25s tid=0x00007f6a741f1800 nid=0x1a5 waiting on condition  [0x00007f6a17a9f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep([email protected]/Native Method)
        at Server.sleepForever(Server.java:20)
        at Server.lambda$0(Server.java:9)
        at Server$$Lambda$1/0x0000000840060840.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:834)

"Thread-1" #13 prio=5 os_prio=0 cpu=0.00ms elapsed=496.25s tid=0x00007f6a741f3800 nid=0x1a6 waiting on condition  [0x00007f6a1798f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep([email protected]/Native Method)
        at Server.sleepForever(Server.java:20)
        at Server.lambda$0(Server.java:9)
        at Server$$Lambda$1/0x0000000840060840.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:834)

"Thread-2" #14 prio=5 os_prio=0 cpu=0.00ms elapsed=496.25s tid=0x00007f6a741f5000 nid=0x1a7 waiting on condition  [0x00007f6a1787f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep([email protected]/Native Method)
        at Server.sleepForever(Server.java:20)
        at Server.lambda$0(Server.java:9)
        at Server$$Lambda$1/0x0000000840060840.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:834)

"Attach Listener" #15 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=0.10s tid=0x00007f6a28001000 nid=0x1dc waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=0.00ms elapsed=496.31s tid=0x00007f6a74162000 nid=0x19b runnable

"GC Thread#0" os_prio=0 cpu=0.00ms elapsed=496.32s tid=0x00007f6a74028000 nid=0x196 runnable

"G1 Main Marker" os_prio=0 cpu=0.00ms elapsed=496.32s tid=0x00007f6a74070800 nid=0x197 runnable

"G1 Conc#0" os_prio=0 cpu=0.00ms elapsed=496.32s tid=0x00007f6a74072800 nid=0x198 runnable

"G1 Refine#0" os_prio=0 cpu=0.00ms elapsed=496.32s tid=0x00007f6a74138000 nid=0x199 runnable

"G1 Young RemSet Sampling" os_prio=0 cpu=0.00ms elapsed=496.32s tid=0x00007f6a74139800 nid=0x19a runnable
"VM Periodic Task Thread" os_prio=0 cpu=0.00ms elapsed=496.27s tid=0x00007f6a741db000 nid=0x1a3 waiting on condition

JNI global refs: 6, weak refs: 0

(2) ps

Java sur Linux délègue le threading au thread natif du système d'exploitation. En d'autres termes, il existe une relation "Java thread" = "OS thread". Par conséquent, si vous utilisez une commande qui peut vérifier l'état du thread du système d'exploitation, vous pouvez indirectement vérifier l'état du thread Java.

Il existe plusieurs façons de vérifier l'état des threads du système d'exploitation, mais la plus polyvalente et la plus utile est «ps». L'exemple d'exécution est le suivant. La quantité d'informations telles que le nom du thread et la trace de la pile est inférieure à celle de jstack, mais cela suffit pour une simple confirmation.

$ ps -L mu 404
USER       PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dev        404     -  0.0   21  0.2 6100336 25820 tty1    -    Dec25   0:00 java Server
dev          -   404  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   405  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   406  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   407  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   408  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   409  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   410  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   411  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   412  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   413  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   414  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   415  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   416  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   417  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   418  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   419  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   420  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   421  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   422  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   423  0.0    -    -      -     - -        Sl   Dec25   0:00 -
dev          -   476  0.0    -    -      -     - -        Sl   00:06   0:00 -

référence

Cet article a été confirmé pour fonctionner dans l'environnement suivant.

software version
OS Ubuntu 18.04.2 LTS (Windows Subsystem for Linux)
JDK openjdk 11.0.4 2019-07-16
ps ps from procps-ng 3.3.12

Recommended Posts

Commande pour vérifier le nombre et l'état des threads Java
[Java] Vérifiez le nombre d'occurrences de caractères
J'ai essayé de résumer les bases de kotlin et java
Vérifiez l'état des applications Java sans utiliser d'outils de surveillance
Vérifier l'état de migration des rails
Comment vérifier l'extension et la taille des fichiers téléchargés
[Java] Divers résumés joints aux chefs de classe et aux membres
Méthode pour additionner le nombre d'années et obtenir la fin du mois
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
J'ai essayé de résumer les méthodes de Java String et StringBuilder
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Vérifiez le contenu du magasin de certificats Java
Mémo: [Java] Vérifiez le contenu du répertoire
Comment déterminer le nombre de parallèles
Sortie du livre "Introduction à Java"
À propos du nombre de threads de Completable Future
Vérifiez le fonctionnement de l'interface à travers le thread
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Comment modifier le nombre maximum et maximum de données POST dans Spark
Comment trouver le nombre total de pages lors de la pagination en Java
[Cas d'amélioration Java] Comment atteindre la limite de l'auto-apprentissage et au-delà
J'ai essayé de traduire la grammaire de R et Java [Mis à jour de temps en temps]
Vérifiez la version de JDK installée et la version de JDK activée
[Java] La partie déroutante de String et StringBuilder
J'ai comparé les caractéristiques de Java et .NET
Compilez et exécutez Java sur la ligne de commande
Java Bienvenue dans le marais des tableaux bidimensionnels
Je souhaite créer un ExecutorService qui augmente ou diminue le nombre de threads en fonction de l'état de la tâche et définit une limite supérieure sur le nombre de threads.
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Introduction à la commande java
[Java] Comment obtenir l'URL de la source de transition
[Java] Types de commentaires et comment les rédiger
Veuillez noter la division (division) de java kotlin Int et Int
Vérifiez la capacité du serveur Linux. (Commande Df, commande du)
[Java] Vérifiez la version JDK du fichier war construit
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Organiser l'état actuel de Java et envisager l'avenir
Langage Java du point de vue de Kotlin et C #
[Java] Comment obtenir la valeur maximale de HashMap
Vérifiez le comportement de Java Intrinsic Locks avec bpftrace
Classes et instances Java comprises dans la figure
J'ai résumé les types et les bases des exceptions Java
Java: utilisez Stream pour trier le contenu d'une collection
Vérifiez l'état de l'application de la limite de débit de docker pull
Limiter le nombre de threads à l'aide du service d'exécution de Java
[Note] Sortie Java de la somme des éléments pairs et impairs
Générer et exécuter le fichier Jar du fichier Java appartenant au package
Différence entre Java et JavaScript (comment trouver la moyenne)
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
[Ruby] Questions et vérification du nombre d'arguments de méthode
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Je veux appeler une méthode et compter le nombre
Les débutants en Java ont brièvement résumé le comportement de Array et ArrayList
[Java] Pour connaître les informations de type des paramètres de type à l'exécution
Comptez le nombre de chiffres après la virgule décimale en Java
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Avantages et inconvénients de Java