Другие постеры верны - ctrl-break в консоли или jstack.
В противном случае, если вы используете Java 1.5 или выше, вы можете получить эту информацию программно во время выполнения, используя:
Thread.getAllStackTraces()
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getAllStackTraces())
, затем итерация результатов.
Немного скучно, но примерно так:
Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces();
Iterator<Thread> i = traces.keySet().iterator();
while (i.hasNext()) {
Thread thd = i.next();
System.out.println("*** Thread id"+thd.getId()+":"+thd.getName()+" ***");
StackTraceElement[] trace = traces.get(thd);
for (int j=0; j < trace.length; ++j) {
System.out.println(trace[j]);
}
System.out.println();
}
Затем вы можете выбрать любой метод, который вы хотите перехватить в вашей программе, чтобы это произошло, и отформатировать / направить вывод.
Недостаток этого метода заключается в том, что он не является точным, поскольку не гарантируется, что стеки различных потоков будут взяты в одно и то же время. Однако есть дополнительное преимущество в производительности, заключающееся в том, что весь ваш процесс не будет приостановлен, пока делается снимок.