Befehl zum Überprüfen der Anzahl und des Status von Java-Threads

Wenn Sie einen Java-Anwendungsserver warten und betreiben, möchten Sie möglicherweise die Anzahl und den Status der aktuell ausgeführten Threads kennen. Ich denke, dass ein allgemeiner Java-Anwendungsserver über eine Art Integritätsprüfungsfunktion verfügt, aber je nach Situation ist eine solche Funktion möglicherweise nicht verfügbar. Wie kann ich in einer solchen Situation die Anzahl und den Status von Threads ermitteln?

Beispiel

Die folgende Server.java ist ein Programm, das einen Java-Anwendungsserver imitiert und drei untergeordnete Threads teilt.

Server.java


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

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

        //Legen Sie den übergeordneten Thread selbst in den Ruhezustand.
        sleepForever();
    }

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

Kompilieren Sie dies und führen Sie es aus.

$ java Server &
[1] 404

(1) jstack

Wenn Sie die Anzahl und den Status von Threads wissen möchten, ist "jstack" wahrscheinlich das Beste. jstack ist ein Befehl, der mit dem JDK geliefert wird. Wenn Sie also ein System haben, das einen Java-Anwendungsserver verwendet, sollten Sie ihn in vielen Fällen verwenden können.

Das Folgende ist ein Beispiel für die Ausführung von "jstack". Sie können sehen, dass zusätzlich zum Hauptthread und seinen untergeordneten Threads Thread-0-Thread-1-Thread-2 der Status einiger von jvm verwendeter Threads zusammen mit dem Stack-Trace angezeigt wird.

$ 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 unter Linux delegiert das Threading an die nativen Threads des Betriebssystems. Mit anderen Worten, es gibt eine Beziehung zwischen "Java-Thread" = "OS-Thread". Wenn Sie einen Befehl verwenden, mit dem der Status des Betriebssystem-Threads überprüft werden kann, können Sie daher indirekt den Status des Java-Threads überprüfen.

Es gibt verschiedene Möglichkeiten, den Status von Betriebssystem-Threads zu überprüfen, aber die vielseitigste und nützlichste ist "ps". Das Ausführungsbeispiel lautet wie folgt. Die Menge an Informationen wie Threadname und Stack-Trace ist geringer als die von "jstack", dies reicht jedoch für eine einfache Bestätigung aus.

$ 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 -

Referenz

Es wurde bestätigt, dass dieser Artikel in der folgenden Umgebung funktioniert.

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

Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
[Java] Überprüfen Sie die Anzahl der Zeichen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
Überprüfen Sie den Migrationsstatus von Schienen
So überprüfen Sie die Erweiterung und Größe der hochgeladenen Dateien
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
Methode, um die Anzahl der Jahre zu addieren und das Monatsende zu erhalten
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
So bestimmen Sie die Anzahl der Parallelen
Ausgabe des Buches "Einführung in Java"
Über die Anzahl der Threads von Completable Future
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
[Java-Verbesserungsfall] Wie man die Grenze des Selbststudiums und darüber hinaus erreicht
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Überprüfen Sie die installierte und aktivierte JDK-Version
[Java] Der verwirrende Teil von String und StringBuilder
Ich habe die Eigenschaften von Java und .NET verglichen
Kompilieren Sie Java und führen Sie es in der Befehlszeile aus
Java Willkommen im Sumpf der zweidimensionalen Arrays
Ich möchte einen ExecutorService erstellen, der die Anzahl der Threads abhängig vom Aufgabenstatus erhöht oder verringert und eine Obergrenze für die Anzahl der Threads festlegt.
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Einführung in den Java-Befehl
[Java] So erhalten Sie die URL der Übergangsquelle
[Java] Arten von Kommentaren und wie man sie schreibt
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Überprüfen Sie die Kapazität des Linux-Servers. (Df Befehl, du Befehl)
[Java] Überprüfen Sie die JDK-Version der erstellten Kriegsdatei
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Den aktuellen Status von Java organisieren und die Zukunft betrachten
Java-Sprache aus der Sicht von Kotlin und C #
[Java] So erhalten Sie den Maximalwert von HashMap
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
In der Abbildung verstandene Java-Klassen und -Instanzen
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
Überprüfen Sie den Status der Ratenbegrenzungsanwendung für Docker Pull
Begrenzen Sie die Anzahl der Threads mithilfe des Java Executor Service
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
Generieren und Ausführen der Jar-Datei der zum Paket gehörenden Java-Datei
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Kommen Sie zu den Abkürzungen aus den fünf Beispielen für kursive Java-Listen
[Ruby] Fragen und Überprüfung der Anzahl der Methodenargumente
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
Ich möchte eine Methode aufrufen und die Nummer zählen
Java-Anfänger fassten das Verhalten von Array und ArrayList kurz zusammen
[Java] Um die Typinformationen der Typparameter zur Laufzeit zu kennen
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Vor- und Nachteile von Java