Kill -3, чтобы получить java thread dump

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

Ответ 1

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

jstack PID > outfile

Ответ 2

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

Ответ 3

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

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

Ответ 4

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

jcmd <PID> Thread.print

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

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

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

Ответ 5

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

Ответ 6

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

  • Убить -3: выводит вывод на стандартный вывод.
  • Если у вас есть доступ к окну консоли, где работает сервер, можно использовать комбинацию клавиш Ctrl + Break для генерации трассировки стека на выходе std.
  • Для hotspot VM мы также можем использовать команду jstack для создания дампа потока. Это часть JDK. Синтаксис выглядит следующим образом: Применение: jstack [-l] (для подключения к запущенному процессу) jstack -F [-m] [-l] (для подключения к зависанию процесса)
  • Для JVM JRockit мы можем использовать команду JRCMD, которая поставляется с синтаксисом JDK: jrcmd [[]] [-l] [-f file] [-p] -h]

Ответ 7

В 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>

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

Ответ 8

  • Найти идентификатор процесса [PS ID]
  • Выполнить jcmd [PS ID] Thread.print

Ответ 9

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

Шаг 1: Получить идентификатор процесса для оболочки script, вызвав 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