9 ответов:
вы можете также использовать jstack (входит в комплект JDK), чтобы взять дамп потока и записать вывод везде, где вы хотите. Это не доступно в среде Unix?
jstack PID > outfile
дамп потока записывается в систему из виртуальной машины, на которой вы выполнили убийство -3. Если вы перенаправляете консольный вывод JVM в файл, дамп потока будет находиться в этом файле. Если JVM работает в открытой консоли, то дамп потока будет отображаться в консоли.
есть способ перенаправить вывод дампа потока JVM на сигнал разрыва для разделения файла с опция диагностики LogVMOutput:
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
С Java 8 на рисунке,
jcmdпредпочтительный подход.jcmd <PID> Thread.printНиже приведен фрагмент документация Oracle:
выпуск JDK 8 представил Java Mission Control, Java Flight Recorder и утилиту jcmd для диагностики проблем с приложениями JVM и Java. предлагается использовать последнюю утилиту jcmd вместо предыдущей утилиты jstack для улучшенной диагностики и снижения производительности накладные расходы.
однако доставка этого с приложением может иметь последствия лицензирования, которые я не уверен.
при использовании kill -3 следует видеть дамп потока в стандартном выходе. Большинство серверов приложений записывают стандартный вывод в отдельный файл. Вы должны найти его там при использовании kill -3. Существует несколько способов получения дампов потоков:
- Kill -3: дает выход к стандартному выходу.
- Если у вас есть доступ к окну консоли, где работает сервер, можно использовать комбинацию клавиш Ctrl + Break для создания трассировки стека на std выход.
- для виртуальной точки доступа мы можем использовать команду jstack, чтобы генерировать дамп потока. Это часть JDK. Синтаксис выглядит следующим образом: Использование: jstack [- l] (для подключения к запущенному процессу) jstack-F [- m] [- l] (для подключения к зависшему процессу)
- для виртуальная машина JRockit JVM в мы можем использовать команду JRCMD, который поставляется с JDK для синтаксис: jrcmd [ []] [л] [-F файл] [-р] -ч]
в 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 в файловую консоль, указанную в приведенной выше команде.
шаги, которые вы должны следовать, если вы хотите дамп потока вашего автономного процесса 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
Comments