Инструменты для мониторинга выполнения потоков java

У меня есть веб-приложение java, работающее на сервере Tomcat(Linux). В производственной среде я сталкиваюсь с некоторыми проблемами производительности. Через случайные интервалы процесс jsvc, на котором работает tomcat, начинает работать на 90-100% CPU. Я не могу найти триггер для этого события. Сервер представляет собой четырехъядерную систему. Потребление памяти не указывает на какие-либо аномалии.

Как я могу контролировать, какой поток (трассировка стека приложения) в приложении вызывает проблема?

Я проверяю с утилиты jconsole и PSI зонд, но оба не дают никакой подробной информации о том, какой поток внутри приложения вызывает аномалию использования процессора.

5 ответов


один относительно простой способ сделать это (который может или может не работать в вашем случае -- зависит от того, как долго происходит):

когда ваше приложение демонстрирует поведение, которое вы хотите отладить (в этом случае 90-100% использования процессора), используйте jstack для ID процесса:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

чтобы проверить, какие потоки работают и в каких методах они происходят. Если вы сделаете это несколько раз, это может быть относительно легко определить цепочку вызовов виновника. Затем вы можете просто отладить вход в эту цепочку.

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


, который VisualVM это то, что вы ищете. Он поставляется с новыми JDKs и позволяет контролировать нить использование.


вы можете получить дамп stacktrace для всех потоков в любом приложении Java, отправив ему сигнал выхода.

 kill -QUIT [processId]

Это будет отображаться в процессе stdout.


еще один инструмент для отображения верхних cpu-потребляющих потоков -jvmtop


только мои 2 цента, но мне интересно, если вы не экспериментируете с проблемой памяти, пики процессора могут быть активностью GC. Поэтому, пока вы отслеживаете свой tomcat с помощью jconsole, посмотрите на вкладку памяти и проверьте, не будет ли использование кучи высоким.