Я использую команду kill -3
, чтобы увидеть дамп потока JVM в unix. Но где я могу найти выход этой команды kill
? Я потерян!
Kill -3, чтобы получить java thread dump
Ответ 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