Я использую kill -3
команду, чтобы увидеть дамп потока JVM в unix. Но где я могу найти вывод этой kill
команды? Я потерян!!
Я использую kill -3
команду, чтобы увидеть дамп потока JVM в unix. Но где я могу найти вывод этой kill
команды? Я потерян!!
Ответы:
В качестве альтернативы вы можете использовать jstack (входит в состав JDK), чтобы получить дамп потока и записать результат в любом месте. Разве это не доступно в среде unix?
jstack PID > outfile
Дамп потока записывается в систему из виртуальной машины, на которой вы выполнили kill -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 для расширенной диагностики и снижения накладных расходов на производительность.
Однако доставка этого вместе с приложением может иметь последствия для лицензирования, в чем я не уверен.
jcmd
не удается подключиться к процессу обслуживания окна с com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
пока jstack -F
преуспевает: stackoverflow.com/questions/1197912/...
При использовании kill -3 в стандартном выводе должен отображаться дамп потока. Большинство серверов приложений записывают стандартный вывод в отдельный файл. Вы должны найти его там, используя kill -3. Есть несколько способов получить дамп потоков:
kill -3 <PID>
: Выводит вывод на стандартный вывод.Для виртуальных машин хот-спотов мы также можем использовать jstack
команду для создания дампа потока. Это часть JDK. Синтаксис следующий:
Usage:
jstack [-l] <pid> (to connect to running process)
jstack -F [-m] [-l] <pid>(to connect to a hung process)
- For JRockit JVM we can use JRCMD command which comes with JDK Syntax:
jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
kill -3 <PID>
следует убивать JVM. Какой тип Java-приложения вы ищете?
Действия, которые следует выполнить, если вы хотите получить дамп потока автономного 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