Получить обнаружение взаимоблокировки из запущенной программы или дампа в Java - PullRequest
3 голосов
/ 14 ноября 2011

У меня есть часть работающего программного обеспечения Java, которое застряло. Я хотел бы получить представление внутри, но не знаю, как это сделать.

Есть ли какой-нибудь инструмент, который я могу дать PID, и он скажет мне, где в настоящее время находится каждый поток и, возможно, также несколько значений переменных? Я использую Linux.

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

Я не могу воспроизвести ошибку, потому что она появляется только раз в несколько дней и никогда не появлялась при отладке, так что это уникальная возможность узнать врага.

Есть идеи?

Ответы [ 3 ]

10 голосов
/ 14 ноября 2011

На самом деле вы можете попробовать использовать visualvm + его плагин для мониторинга потоков . Вы также сможете создавать дампы потока, просматривать трассировки стека потоков и их состояния. Вы также можете использовать jconsole для обнаружения взаимоблокировок. Оба инструмента являются частью JDK. JConsole

Здесь - дополнительная информация об использовании visualvm для анализа потоков.

4 голосов
/ 14 ноября 2011

Вы можете взять дамп потока этого. Вы можете использовать kill -3 PID, где PID - это идентификатор вашего процесса. Это приведет к выводу дампа потока на стандартный вывод вашей программы.

Это покажет вам, что делает каждый поток, но не даст вам никакой информации относительно переменных. В любом случае, дампы потоков действительно полезны. Я бы начал там. Если вы все еще не можете решить проблему, вы можете использовать что-то вроде jmap (инструмент JVM, бесплатный, но сложный в использовании) или YourKit (платный продукт, но очень хороший), чтобы сделать снимок памяти и изучить переменные.

Некоторая информация о jmap: Профилирование памяти Java с помощью jmap и jhat

0 голосов
/ 04 июля 2017

В последних версиях JVM (OpenJDK / Oracle Java 7 или выше), если вы берете дамп кучи (используя VisualVM или jmap), он также включает дамп стеков всех запущенных в данный момент потоков со ссылками на соответствующие объектыв кучу.Затем вы можете просмотреть стеки, открыв дамп кучи в VisualVM.

...