убить -3, чтобы получить дамп потока Java - PullRequest
106 голосов
/ 02 февраля 2011

Я использую команду kill -3, чтобы увидеть дамп потока JVM в unix. Но где я могу найти вывод этой команды kill? Я заблудился !!

Ответы [ 9 ]

183 голосов
/ 02 февраля 2011

В качестве альтернативы вы можете использовать jstack (входит в JDK), чтобы получить дамп потока и записать вывод в любое место.Разве это не доступно в среде Unix?

jstack PID > outfile
37 голосов
/ 02 февраля 2011

Дамп потока записывается в систему вне виртуальной машины, на которой вы выполнили kill -3.Если вы перенаправляете консольный вывод JVM в файл, дамп потока будет в этом файле.Если JVM работает в открытой консоли, дамп потока будет отображаться в ее консоли.

28 голосов
/ 17 января 2013

Существует способ перенаправить вывод дампа потока JVM по сигналу разрыва в отдельный файл с помощью Опция диагностики LogVMOutput :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
21 голосов
/ 06 декабря 2015

С Java 8 на картинке, jcmd является предпочтительным подходом.

jcmd <PID> Thread.print

Ниже приведен фрагмент из документации Oracle :

В выпуске JDK 8 представлены Java Mission Control, Java Flight Recorder и утилита jcmd для диагностики проблем сПриложения JVM и Java. Рекомендуется использовать последнюю утилиту, jcmd вместо предыдущей утилиты jstack, для расширенной диагностики и снижения производительности.

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

9 голосов
/ 02 февраля 2011

В том же месте, где находится стандартный вывод JVM.Если у вас есть сервер Tomcat, это будет файл catalina_(date).out.

7 голосов
/ 08 апреля 2014

При использовании kill -3 вы должны увидеть дамп потока в стандартном выводе.Большинство серверов приложений записывают стандартный вывод в отдельный файл.Вы должны найти его там при использовании kill -3.Существует несколько способов получения дампов потоков:

  • Kill -3: выводит вывод на стандартный вывод.
  • Если у вас есть доступ к окну консоли, где работает сервер, можно использоватьКомбинация клавиш Ctrl + Break для генерации трассировки стека на выходе std.
  • Для виртуальной машины с горячей точкой мы также можем использовать команду jstack для генерации дампа потока.Это часть JDK.Синтаксис выглядит следующим образом: Использование: jstack [-l] (для подключения к запущенному процессу) jstack -F [-m] [-l] (для подключения к зависшему процессу)
  • Для JRockit JVM мы можем использоватьКоманда JRCMD, которая поставляется с синтаксисом JDK: jrcmd [[]] [-l] [-f file] [-p] -h]
2 голосов
/ 25 июня 2015
  1. Найти идентификатор процесса [PS ID]
  2. Выполнить jcmd [PS ID] Thread.print
2 голосов
/ 24 сентября 2013

В Jboss вы можете выполнить следующие действия:

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Это перенаправит ваш вывод / нить в консоль файла, указанную в приведенной выше команде.

1 голос
/ 18 декабря 2015

Шаги, которые вы должны выполнить, если хотите получить дамп потока вашего автономного Java-процесса

Шаг 1: Получить идентификатор процесса для сценария оболочки, вызывающего программу Java

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

Шаг 2: Получите идентификатор процесса для ребенка, который был вызван runABCD.Используйте указанный выше PID для получения дочерних элементов.

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

Шаг 3: Получите JSTACK для конкретного процесса.Получите идентификатор вашего процесса XYSServer.т.е. 8536

linux$ jstack **8536** > threadDump.log
...