Ответ 1
Ввод Ctrl + Break - это правильный способ создания дампа потока в Windows.
Возможно, вы нажимаете Ctrl + C (= прерывание)? Это отправит SIGINT, который, как правило, убивает ваш процесс.
У меня есть работающий java-процесс в стандартном окне команд Windows. т.е. я запустил 'cmd' и набрал java -jar...
Мне нужно иметь возможность получить полный дамп стека всех потоков, если это вообще возможно.
Я помню, что в Linux вы можете отправить сообщение в JVM с помощью опции команды quit.
в этот документ состояние солнца
Чтобы создать трассировку стека в Windows 95 или Windows NT, введите последовательность клавиш в окно, где программа Java или нажмите кнопку "Закрыть" на окна.
это явно неправильно, так как закрытие терминала ничего не значит, кроме как убить процесс и закрыть окно.
Ввод Ctrl + Break - это правильный способ создания дампа потока в Windows.
Возможно, вы нажимаете Ctrl + C (= прерывание)? Это отправит SIGINT, который, как правило, убивает ваш процесс.
Вы можете использовать jstack [ option ] pid
(если вопрос о дампе потока). Используйте jps
, чтобы найти идентификатор вашего Java-процесса.
В Java 6 JDK + исполняемый файл jvisualvm позволяет присоединять к запущенной программе (дважды щелкните по его записи в левой части).
При подключении к правой стороне находится панель Threads с кнопкой Thread Dump.
Это дает вам дамп потока.
После создания вы можете A) Выбрать все - Скопировать и вставить дамп потока в текстовый редактор. или B) вы можете щелкнуть правой кнопкой мыши по дампу потока, созданному в дереве с левой стороны, и сказать "Сохранить как".
Примечания jvisualvm также позволяет делать снимки всего приложения для последующего анализа.
Это может помочь вам, но также зависит от того, какую версию JVM и поставщика вы используете.
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/
http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html
Помимо ответа Seth, вы также можете запустить JConsole на своем компьютере, чтобы проверить каждую трассировку стека потоков. Это имеет дополнительное преимущество, позволяющее обнаруживать взаимоблокировки и контролировать использование памяти.
Другие плакаты верны - 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();
}
Затем вы можете выбрать любой способ, которым вы хотите уловить вашу программу, чтобы это произошло, и форматировать/направлять вывод.
Недостаток этого метода заключается в том, что он не является точным, поскольку стеки разных потоков не гарантируются в то же время. Однако существует связанное с этим преимущество производительности, так как весь ваш процесс не будет приостановлен во время моментального снимка.
Взгляните на этот пост
Программный программный пакет нити /JDI (интерфейс отладки Java)
Мы реализовали JMX-метод для удаления следов стека. Это очень удобно, потому что вы можете проверять трассировки стека в веб-браузере даже на удаленной машине.