Получить обнаружение взаимоблокировки из запущенной программы или дампа в Java

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

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

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

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

Есть идеи?