Подтвердить что ты не робот

Сброс java-стека по окнам

У меня есть работающий java-процесс в стандартном окне команд Windows. т.е. я запустил 'cmd' и набрал java -jar...

Мне нужно иметь возможность получить полный дамп стека всех потоков, если это вообще возможно.

Я помню, что в Linux вы можете отправить сообщение в JVM с помощью опции команды quit.

в этот документ состояние солнца

Чтобы создать трассировку стека в Windows 95 или Windows NT, введите последовательность клавиш в окно, где программа Java или нажмите кнопку "Закрыть" на окна.

это явно неправильно, так как закрытие терминала ничего не значит, кроме как убить процесс и закрыть окно.

4b9b3361

Ответ 1

Ввод Ctrl + Break - это правильный способ создания дампа потока в Windows.

Возможно, вы нажимаете Ctrl + C (= прерывание)? Это отправит SIGINT, который, как правило, убивает ваш процесс.

Ответ 2

Вы можете использовать jstack [ option ] pid (если вопрос о дампе потока). Используйте jps, чтобы найти идентификатор вашего Java-процесса.

Ответ 3

В Java 6 JDK + исполняемый файл jvisualvm позволяет присоединять к запущенной программе (дважды щелкните по его записи в левой части).

При подключении к правой стороне находится панель Threads с кнопкой Thread Dump.

Это дает вам дамп потока.

После создания вы можете A) Выбрать все - Скопировать и вставить дамп потока в текстовый редактор. или B) вы можете щелкнуть правой кнопкой мыши по дампу потока, созданному в дереве с левой стороны, и сказать "Сохранить как".

Примечания jvisualvm также позволяет делать снимки всего приложения для последующего анализа.

Ответ 5

Помимо ответа Seth, вы также можете запустить JConsole на своем компьютере, чтобы проверить каждую трассировку стека потоков. Это имеет дополнительное преимущество, позволяющее обнаруживать взаимоблокировки и контролировать использование памяти.

Ответ 6

Другие плакаты верны - 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();
}

Затем вы можете выбрать любой способ, которым вы хотите уловить вашу программу, чтобы это произошло, и форматировать/направлять вывод.

Недостаток этого метода заключается в том, что он не является точным, поскольку стеки разных потоков не гарантируются в то же время. Однако существует связанное с этим преимущество производительности, так как весь ваш процесс не будет приостановлен во время моментального снимка.