Когда использование Bash просто пробует это:
$ export JAVA_HOME=/usr/tomcat/jre
Чтобы получить итеративный набор:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Получите дескриптор корневой ThreadGroup
, например:
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}
Теперь вызовите функцию enumerate ()
для корневую группу повторно. Второй аргумент позволяет вам получить все потоки рекурсивно:
Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
threads = new Thread[threads.length * 2];
}
Обратите внимание, как мы многократно вызываем enumerate (), пока массив не станет достаточно большим, чтобы содержать все записи.
Да, взгляните на , чтобы получить список потоков . На этой странице много примеров.
Это делается программно. Если вам просто нужен список в Linux, по крайней мере, вы можете просто использовать эту команду:
kill -3 processid
, и виртуальная машина сделает дамп потока на стандартный вывод.
Вы смотрели jconsole ?
Здесь перечислены все потоки, выполняющиеся для конкретного процесса Java.
Вы можете запустить jconsole из корзины JDK папку.
Вы также можете получить полную трассировку стека для всех потоков, нажав Ctrl + Break
в Windows или отправив kill pid --QUIT
в Linux.
Вы можете получить много информации о потоках из ThreadMXBean .
Вызовите статический метод ManagementFactory.getThreadMXBean () , чтобы получить ссылку на MBean.
public static void main(String[] args) {
// Walk up all the way to the root thread group
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parent;
while ((parent = rootGroup.getParent()) != null) {
rootGroup = parent;
}
listThreads(rootGroup, "");
}
// List all threads and recursively list all subgroup
public static void listThreads(ThreadGroup group, String indent) {
System.out.println(indent + "Group[" + group.getName() +
":" + group.getClass()+"]");
int nt = group.activeCount();
Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
nt = group.enumerate(threads, false);
// List every thread in the group
for (int i=0; i<nt; i++) {
Thread t = threads[i];
System.out.println(indent + " Thread[" + t.getName()
+ ":" + t.getClass() + "]");
}
// Recursively list all subgroups
int ng = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
ng = group.enumerate(groups, false);
for (int i=0; i<ng; i++) {
listThreads(groups[i], indent + " ");
}
}
В консоли java нажмите Ctrl-Break . Он перечислит все потоки и некоторую информацию о куче. Конечно, это не даст вам доступа к объектам. Но в любом случае это может быть очень полезно для отладки.