Скажем, ваша Java-программа принимает 100% -ный процессор. Он имеет 50 потоков. Вам нужно найти, какая нить виновна. Я не нашел инструмент, который может помочь. В настоящее время я использую следующую очень трудоемкую процедуру:
- Запустите
jstack <pid>
, где pid - это идентификатор процесса Java-процесса. Легкий способ найти это - запустить еще одну утилиту, включенную в JDK -jps
. Лучше перенаправить jstack-вывод в файл. - Поиск "runnable" потоков. Пропустите те, которые ждут сокета (по какой-то причине они по-прежнему помечены как runnable).
- Повторите шаги 1 и 2 пару раз и посмотрите, можете ли вы найти шаблон.
В качестве альтернативы вы можете подключиться к процессу Java в Eclipse и попытаться приостановить потоки один за другим, пока не нажмете тот, который запускает CPU. На машине с одним процессором вам может потребоваться сначала снизить приоритет процесса Java, чтобы иметь возможность передвигаться. Даже тогда Eclipse часто не может подключиться к запущенному процессу из-за таймаута.
Я бы ожидал использования инструмента Sun visualvm
.
Знает ли кто-нибудь лучший способ?