kill -3 или jstack: В чем разница?

Я хочу получить дамп потока моего веб-приложения, который работает на сервере jboss.

Я нашел два решения для своей проблемы:

  • Использование команды unix: kill -3
  • Использование инструмента jstack, который существует в JDK.

Может ли кто-нибудь объяснить мне разницу между этими двумя методами?

Заранее спасибо !

Ответ 1

Команда jstack может получить дамп потока программы, запущенной на удаленной машине, а также работает в Windows.

kill -3 работает только с локальными программами, а в Windows нет kill.

Ответ 2

На странице оракула jstack:

Выход из опции jstack pid такой же, как и при нажатии Ctrl+\на консоли приложения (стандартный ввод) или путем отправки процессу сигнала QUIT.

Также помните, что Ctrl+\ is equivalent to a SIGQUIT.

Из того, что убивает -3 (unix.se):

kill -l показывает нам все сигналы. После этого намека 3 означает SIGQUIT

Таким образом, в основном оба они выполняют точно то же самое, то есть запрашивают coredump. Вот несколько указателей, связанных с jstack:

  • Jstack выполняет обнаружение блокировки по умолчанию.
  • Что касается официальной поддержки, со страницы jstack man:

    Распечатывает трассировки стека потоков Java для процесса Java, основного файла или удаленного сервера отладки. Эта команда является экспериментальной и неподдерживаемой.

    Эта утилита не поддерживается и может быть недоступна в будущей версии JDK. В системах Windows, где отсутствует файл dbgeng.dll, необходимо установить средства отладки для Windows, чтобы эти инструменты работали.

Что касается разности выходных данных, то это в основном то же самое. Между выходами имеется одно к одному. См. Мой вывод для того же приложения, чтобы продемонстрировать сопоставление между статусами kill -3 и jstack. Отображение между состояниями:

kill -3         |  Jstack
------------------------------  
RUNNABLE        |  IN_NATIVE
TIMED_WAITING   |  BLOCKED
WAITING         |  BLOCKED (PARK)

Ответ 3

В Windows у вас есть что-то, называемое taskkill/PID {pidpid}/F для процесса killin. Идентификатор процесса можно получить из команды netstat или использовать viusal vm, чтобы узнать идентификатор процесса