kill -3, чтобы получить java thread dump
Я использую команду kill -3
для просмотра дампа JVM в unix. Но где я могу найти результат этой команды kill
? Я потерян!!
- Запуск задач в foreach Loop использует значение последнего элемента
- Блокирует Console.WriteLine?
- Каковы различия между различными параметрами синхронизации streamов в C #?
- System.Threading.Tasks - ограничение количества одновременных задач
- ThreadLocal и утечка памяти
- Разрыв параллельный.
- Продюсер / Потребительские streamи с использованием очереди
- Как дождаться завершения ряда streamов?
В качестве альтернативы вы можете использовать jstack (в комплекте с JDK), чтобы взять дамп streamа и написать вывод везде, где хотите. Разве это не доступно в среде unix?
jstack PID > outfile
Дамп streamа записывается в систему из виртуальной машины, на которой вы выполнили kill -3. Если вы перенаправляете вывод консоли JVM в файл, дамп streamа будет в этом файле. Если JVM запущен в открытой консоли, тогда дамп streamа будет отображаться на его консоли.
Существует способ перенаправления вывода дампа streamа JVM на сигнал разрыва для разделения файла с помощью опции диагностики LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
С Java 8 в изображении jcmd
является jcmd
.
jcmd Thread.print
Ниже приведен fragment из документации Oracle :
В выпуске JDK 8 были представлены Java Mission Control, Java Flight Recorder и утилита jcmd для диагностики проблем с JVM и Java-приложениями. Рекомендуется использовать последнюю утилиту jcmd вместо предыдущей утилиты jstack для расширенной диагностики и снижения издержек производительности.
Однако отправка этого с помощью приложения может быть следствием лицензирования, которое я не уверен.
В том же месте, где размещена стандартная версия JVM. Если у вас есть сервер Tomcat, это будет файл catalina_(date).out
.
При использовании kill -3 следует видеть дамп streamа в стандартном выходе. Большинство серверов приложений записывают стандартный вывод в отдельный файл. Вы должны найти его там, используя kill -3. Существует несколько способов получения дампов streamов:
- Kill -3: Дает выход на стандартный вывод.
- Если у вас есть доступ к окну консоли, где работает сервер, можно использовать комбинацию клавиш Ctrl + Break для генерации трассировки стека на выходе std.
- Для hotspot VM мы также можем использовать команду jstack для создания дампа streamа. Это часть JDK. Синтаксис следующий: Использование: jstack [-l] (для подключения к запущенному процессу) jstack -F [-m] [-l] (для подключения к зависающему процессу)
- Для JRKit JVM мы можем использовать команду JRCMD, которая поставляется с синтаксисом JDK: jrcmd [[]] [-l] [-f file] [-p] -h]
В Jboss вы можете выполнить следующее
nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null & kill -3
Это перенаправит ваш вывод / threadump на консоль файлов, указанную в приведенной выше команде.
- Найти идентификатор процесса [PS ID]
- Выполнить jcmd [PS ID] Thread.print
Шаги, которые следует выполнить, если вы хотите, чтобы дамп streamа вашего Java-процесса StandAlone
Шаг 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