So ermitteln Sie die Anzahl der Threads in einem Java-Prozess

75

Wie kann ich die Anzahl der Threads in einem Java-Prozess sehen?

ndemir
quelle

Antworten:

53

Das nützliche Tool zum Debuggen von Java-Programmen gibt die Anzahl der Threads und andere relevante Informationen dazu an:

jconsole <process-id>

Laura
quelle
77

ManagementFactory.getThreadMXBean().getThreadCount()beschränkt sich nicht wie Thread.activeCount()hier auf Thread-Gruppen .

gustafc
quelle
+1 Dafür. Die Menge an Thread ist genau die gleiche, die ich sehe top. Obwohl im Debug-Fenster, sehe ich nur 2 Thread anstelle von 5 .: /
Aruman
ManagementFactory? unter welchem ​​paket?
Meher
import java.lang.management.ManagementFactory; docs.oracle.com/javase/8/docs/api/java/lang/management/… Siehe auch getPeakThreadCount()und andere Methoden, bevor Sie anfangen, es selbst zu tun :)
Christophe Roussy
24

Es gibt eine statische Methode für die ThreadKlasse, die die Anzahl der aktiven Threads zurückgibt, die von der JVM gesteuert werden:

Thread.activeCount()

Gibt die Anzahl der aktiven Threads in der Threadgruppe des aktuellen Threads zurück.

Darüber hinaus sollten externe Debugger alle aktiven Threads auflisten (und es Ihnen ermöglichen, eine beliebige Anzahl von Threads auszusetzen), wenn Sie sie in Echtzeit überwachen möchten.

MarkPowell
quelle
12

Generische Lösung, die keine GUI wie jconsole erfordert (funktioniert nicht auf Remote-Terminals), ps funktioniert für Nicht-Java-Prozesse, erfordert keine installierte JVM.

ps -o nlwp <pid>

Felipe Oliveira
quelle
9

Ich habe ein Programm Iterierte alle geschrieben Threadserstellt und Drucken getState()von jedemThread

import java.util.Set;

public class ThreadStatus {
    public static void main(String args[]) throws Exception{
        for ( int i=0; i< 5; i++){
            Thread t = new Thread(new MyThread());
            t.setName("MyThread:"+i);
            t.start();
        }
        int threadCount = 0;
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for ( Thread t : threadSet){
            if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){
                System.out.println("Thread :"+t+":"+"state:"+t.getState());
                ++threadCount;
            }
        }
        System.out.println("Thread count started by Main thread:"+threadCount);
    }
}

class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000);
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

Ausgabe:

java ThreadStatus

Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[main,5,main]:state:RUNNABLE
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:4,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:3,5,main]:state:TIMED_WAITING
Thread count started by Main thread:6

Wenn Sie unter Bedingung entfernen

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())

Sie erhalten auch unter Threads in der Ausgabe, die vom System gestartet wurden.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer.

Ravindra Babu
quelle
5

Verwenden des Linux- TopBefehls

top -H -p (process id)

Mit dieser Methode können Sie die Prozess-ID eines Programms abrufen:

ps aux | grep (your program name)

zum Beispiel :

ps aux | grep user.py

Alihossein Shahabi
quelle
1
    public class MainClass {

        public static void main(String args[]) {

          Thread t = Thread.currentThread();
          t.setName("My Thread");

          t.setPriority(1);

          System.out.println("current thread: " + t);

          int active = Thread.activeCount();
          System.out.println("currently active threads: " + active);
          Thread all[] = new Thread[active];
          Thread.enumerate(all);

          for (int i = 0; i < active; i++) {
             System.out.println(i + ": " + all[i]);
          }
       }
   }
Upul Bandara
quelle
0

Holen Sie sich die Anzahl der Threads mit jstack

jstack <PID> | grep length | cut -d'=' -f 3 | cut -d',' -f 1

Das Ergebnis des obigen Codes unterscheidet sich erheblich von top -H -p <PID>oder ps -o nlwp <PID>weil jstack nur Threads erhält, die von der Anwendung erstellt wurden.

Mit anderen Worten, jstack erhält keine GC-Threads

PS: Verwendung von cutist, woher ich weiß, es zu tun. Hat wahrscheinlich eine einfache und elegante Möglichkeit, diese Zahl aus der jstack-Ausgabe zu extrahieren.

jpozorio
quelle