Инструменты для мониторинга выполнения потока Java - PullRequest
6 голосов
/ 14 января 2011

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

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

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

Ответы [ 6 ]

5 голосов
/ 14 января 2011

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

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

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

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

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

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

VisualVM - это то, что вы ищете. Он поставляется с более новыми JDK и позволяет отслеживать использование потоков .

3 голосов
/ 26 марта 2013

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

2 голосов
/ 14 января 2011

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

 kill -QUIT [processId]

Это отобразится в процессе 'stdout.

1 голос
/ 14 января 2011

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

0 голосов
/ 15 октября 2018

Существует инструмент Linux под названием "threadcpu", который измеряет использование процессором каждого потока.А в случае потока Java он использует jstack для получения и печати имени потока.

http://www.tuxad.com/blog/archives/2018/10/01/threadcpu_-_show_cpu_usage_of_threads/index.html

...