Вопрос или проблема
Раньше я снимал дампы потоков, используя:
kill -3 `pidof java`
Это создаст дампы потоков в catalina.out
; как получить этот вывод в файл, а не в catalina.out
. Обычно команда kill не выводит это в stdout или stderr, поэтому мы не можем получить это, перенаправив скрипт в журнал или используя exec в начале; так есть ли способ сделать это?
Вы можете использовать jstack $(pidof java) > MYFILE
вместо этого.
Java версии 7 и выше имеют инструмент jcmd
, который рекомендуется Oracle. jcmd
объединяет функциональность нескольких диагностических инструментов, таких как jstack
и jmap
.
Вы можете запустить следующую команду jcmd
, чтобы получить дамп потоков процесса с PID 1234 (с выводом, перенаправленным в файл):
jcmd 1234 Thread.print > thread-dump.txt
Больше информации здесь: утилита jcmd, страница man jcmd
Ответ или решение
Зачастую при работе с Java-приложениями необходимо проводить диагностику состояния потоков, особенно в случае возникновения проблем с производительностью или зависаниями. Такой подход, как создание дампов потоков с использованием команды kill -3
, позволяет получить необходимую информацию, но по умолчанию вывод перенаправляется в файл catalina.out
. Если вашей целью является запись дампа потоков в отдельный файл, а не в стандартный вывод Tomcat, можно воспользоваться альтернативными инструментами или подходами.
Использование альтернативных инструментов
-
jstack
Команда
jstack
в простейшем случае может заменитьkill -3
. Для перенаправления дампа потоков в файл, можно использовать следующий командный вызов:jstack $(pidof java) > thread-dump.txt
Это создаст файл
thread-dump.txt
, содержащий состояние всех потоков, которые активны на данный момент. -
jcmd
Инструмент
jcmd
, представленный в Java 7 и более поздних версиях, объединяет функциональность нескольких диагностических инструментов, включаяjstack
иjmap
. Это рекомендованный вариант от Oracle.Чтобы создать дамп потоков и перенаправить вывод в файл, выполните следующую команду:
jcmd $(pidof java) Thread.print > thread-dump.txt
Данный подход позволяет более гибко управлять выводом и получать более детализированную информацию о состоянии вашего JVM.
Дополнительные ресурсы и ссылки
Для дальнейшего изучения возможностей jcmd
, вы можете обратиться к официальной документации:
Вывод
Переход от использования kill -3
к инструментам jstack
или jcmd
предоставляет больше контроля над процессом сбора информации и позволяет более удобно управлять созданием и хранением дампов потоков. Они также предоставляют возможность получения более глубокого понимания текущего состояния JVM, что делает их незаменимыми в арсенале инструментов специалиста по Java.
На каждом этапе важно учитывать особенности конфигурации вашего окружения и версию используемой Java, чтобы выбрать наиболее эффективный и надежный подход.