Дамп потока Java с использованием Kill -3

Вопрос или проблема

Раньше я снимал дампы потоков, используя:

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, можно воспользоваться альтернативными инструментами или подходами.

Использование альтернативных инструментов

  1. jstack

    Команда jstack в простейшем случае может заменить kill -3. Для перенаправления дампа потоков в файл, можно использовать следующий командный вызов:

    jstack $(pidof java) > thread-dump.txt

    Это создаст файл thread-dump.txt, содержащий состояние всех потоков, которые активны на данный момент.

  2. jcmd

    Инструмент jcmd, представленный в Java 7 и более поздних версиях, объединяет функциональность нескольких диагностических инструментов, включая jstack и jmap. Это рекомендованный вариант от Oracle.

    Чтобы создать дамп потоков и перенаправить вывод в файл, выполните следующую команду:

    jcmd $(pidof java) Thread.print > thread-dump.txt

    Данный подход позволяет более гибко управлять выводом и получать более детализированную информацию о состоянии вашего JVM.

Дополнительные ресурсы и ссылки

Для дальнейшего изучения возможностей jcmd, вы можете обратиться к официальной документации:

Вывод

Переход от использования kill -3 к инструментам jstack или jcmd предоставляет больше контроля над процессом сбора информации и позволяет более удобно управлять созданием и хранением дампов потоков. Они также предоставляют возможность получения более глубокого понимания текущего состояния JVM, что делает их незаменимыми в арсенале инструментов специалиста по Java.

На каждом этапе важно учитывать особенности конфигурации вашего окружения и версию используемой Java, чтобы выбрать наиболее эффективный и надежный подход.

Оцените материал
Добавить комментарий

Капча загружается...