Одним из наиболее важных требований при расследовании тупиков является наличие тупика для расследования. В моем последнем блоге я написал код под названием DeadlockDemo
который использовал несколько потоков для переноса случайных сумм между списками банковских счетов, прежде чем застопориться в тупике.
Этот блог запускает этот код, чтобы продемонстрировать несколько способов получения дампа потока. Дамп потока — это просто отчет, показывающий состояние всех потоков вашего приложения в данный момент времени. Хорошая вещь об этом — то, что это содержит различную информацию, которая позволит вам выяснить, почему у вас тупик и, надеюсь, позволит вам исправить это, но об этом позже.
убить SIGQUIT
Если ваше Java-приложение работает на компьютере с UNIX, первый и, возможно, самый простой способ получить дамп потока — это использовать команду kill
UNIX через терминал.
Для этого сначала получите идентификатор процесса или PID вашего приложения с помощью команд ps
и grep
. Например, если вы введете:
1
|
ps –e | grep java |
… тогда вы создадите список, который выглядит примерно так:
1
2
|
74941 ttys000 0 : 00.01 grep java 70201 ttys004 1 : 00.89 /usr/bin/java threads.deadlock.DeadlockDemo |
PID для DeadlockDemo
в этом случае — 70201 и взят из вышеприведенного вывода. Обратите внимание, что разные варианты UNIX или разные аргументы командной строки ps
могут давать немного разные результаты, так что проверьте ваши man
страницы.
Получив ваш PID, используйте его для kill SIGQUIT
команды kill SIGQUIT
:
1
|
kill - 3 70201 |
Команда kill
— это команда UNIX, которая удаляет нежелательные процессы
Хотя -3 выше является аргументом SIGQUIT (эквивалентно клавиатуре ctrl-D), если Java получит этот сигнал, он не выйдет, он отобразит дамп потока на связанном терминале. Затем вы можете взять его и скопировать в текстовый файл для дальнейшего анализа.
jstack
Если вы работаете в Windows, тогда командная строка UNIX недоступна. Чтобы противостоять этой проблеме, Java поставляется с утилитой, которая выполняет эквивалент kill
. Это называется jstack
и доступно как в UNIX, так и в Windows. Он используется так же, как команда kill
показанная выше:
1
|
jstack <PID> |
Чтобы получить PID в Windows, нужно открыть диспетчер задач Windows. Диспетчер задач не отображает идентификаторы PID по умолчанию, поэтому необходимо обновить его настройки, используя параметр меню « view
отметив параметр « Идентификатор процесса» в диалоговом окне « Выбор столбцов» .
Далее нужно просто изучить список процессов и найти подходящий экземпляр java.exe
.
Прочитайте PID jstack
java.exe
и используйте его в качестве аргумента jstack
как показано ниже:
1
|
jstack 3492 |
После выполнения команды вы можете захватить вывод и скопировать его в текстовый файл для дальнейшего анализа.
jVisualVM
jVisualVM — это способ Rolls Royce для получения дампа потоков. Он предоставляется Oracle как инструмент, который позволяет вам получить много различной информации о Java VM. Это включает дампы кучи, использование процессора, профилирование памяти и многое другое.
Фактическое имя программы jvisualvm.exe
в Windows — jvisualvm
или jvisualvm.exe
. После запуска вы увидите что-то вроде этого:
Чтобы получить дамп потока, найдите свое приложение на левой панели приложений , затем щелкните правой кнопкой мыши и выберите: «Дамп потока».
Затем в правой панели jvisualvm отображается дамп потока, как показано ниже:
Обратите внимание, что я видел зависание jvisualvm несколько раз при подключении к локальной виртуальной машине. Когда это произойдет, убедитесь, что его настройки прокси-сервера установлены на No Proxy
Получив дамп потока, мой следующий блог теперь будет использовать его, чтобы выяснить, что не так с примером кода DeadlockDemo
.
Для получения дополнительной информации см. Другие блоги в этой серии .
Ссылка: Исследование тупиков — Часть 2: Получение дампа потока от нашего партнера по JCG Роджера Хьюза в блоге Captain Debug’s Blog .