Статьи

Расследование тупиковых ситуаций — часть 2

Одним из наиболее важных требований при расследовании тупиков является наличие тупика для расследования. В моем последнем блоге я написал код под названием 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 .