Если у вас есть Java-приложение, потребляющее ресурсы ЦП, когда оно ничего не делает, как определить, что оно делает?

Я вызываю Java API поставщика, и на некоторых серверах оказывается, что JVM переходит в цикл опроса с низким приоритетом после входа в API (ЦП при 100% загрузке). Это же приложение на других серверах не демонстрирует такого поведения. Это происходит в WebSphere и Tomcat. Среду сложно настроить, поэтому трудно попытаться сделать что-то вроде профилирования в Eclipse.

Есть ли способ профилировать (или какой-либо другой метод проверки) существующего Java-приложения, работающего в Tomcat, чтобы узнать, какие методы выполняются, пока оно находится в этом состоянии ожидания? В этом состоянии приложение выполняет только один метод (метод поставщика). Поставщик не может воспроизвести поведение (конечно).


Обновлять:

С помощью JConsole я смог определить, кто работает и что делает. Мне потребовалось несколько часов, чтобы понять, почему он это делает. Проблема заключалась в том, что используемый jar API поставщика не совсем соответствовал конфигурации базы данных, которую он использовал. По умолчанию трассировка и мониторинг производительности были включены на серверах с небольшим несоответствием в конфигурации. Я использовал другую банку, и все в порядке.

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

@Cringe - я поэкспериментировал с некоторыми из предложенных вами вариантов. У меня были некоторые проблемы с настройкой JProfiler, он выглядит хорошо (но дорого). Забегая вперед, я добавил плагин Eclipse Profiler, и я буду изучать различные профилировщики с открытым исходным кодом, чтобы сравнить их функциональность.


person bruceatk    schedule 16.08.2008    source источник


Ответы (8)


Если вы используете Java 5 или более позднюю версию, вы можете подключиться к своему приложению, используя jconsole для просмотра всех запущенных потоков. jstack также сделает дамп стека. Я думаю, что это должно работать даже внутри контейнера, такого как Tomcat.

Оба этих инструмента включены в JDK5 и более поздние версии (я предполагаю, что процесс должен быть как минимум Java 5, хотя я могу ошибаться)

Обновление: также стоит отметить, что, начиная с JDK 1.6, обновление 7, теперь существует встроенный профилировщик с именем VisualVM, который можно запустить с помощью "jvisualvm". Похоже, что это проект java.net, поэтому на этой странице может быть доступна дополнительная информация. Я еще не использовал это, но это выглядит полезным для более серьезного анализа.

надеюсь, это поможет

person Joshua McKinnon    schedule 16.08.2008
comment
++ На мой взгляд, сделать несколько снимков стека — это не только быстрый и грязный способ узнать, что требует времени, но и лучший. - person Mike Dunlavey; 22.07.2009

Столкнувшись с той же проблемой, я использовал профилировщик YourKit. Его загрузчик не активируется, если вы на самом деле не подключитесь к нему (хотя он открывает порт для прослушивания соединений). Сам профилировщик имеет хорошее «получение количества времени, затрачиваемого на каждый метод», работая в менее навязчивом режиме.

Другой способ - определить загрузку ЦП (через JNI, поэтому для этого вам понадобится внешняя библиотека) в потоке «сторожевого таймера» с наивысшим приоритетом и начать регистрировать все потоки, когда ЦП достаточно высок в течение достаточно долгого времени. Вы можете найти эту статью полезной.

person Ran Biron    schedule 16.08.2008

Если это для профессиональных целей и у вас есть деньги, попытайтесь получить в свои руки JProfiler. Если вы просто хотите получить некоторую информацию, попробуйте плагин Eclipse Profiler. Я использовал его несколько раз, но я не знаю текущее состояние.

Также доступен новый(?) проект из самого проекта eclipse: http://www.eclipse.org/tptp/ (см. эту статью ). Никогда не использовал его, поэтому я не могу сказать, стоит ли это усилий.

Также есть очень хороший список профилировщиков с открытым исходным кодом, доступных по адресу http://www.manageability.org/blog/stuff/open-source-profilers-for-java

person cringe    schedule 16.08.2008

Если JConsole нельзя использовать, вы можете

  • нажмите CTRL+BREAK под Windows
  • отправить kill -3 <process id> под Linux

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

person Marcel    schedule 23.08.2008
comment
++ Делать это несколько раз, я думаю, на самом деле лучший способ диагностировать проблемы с производительностью. У меня нет проблем с инструментами, пока их техника действительно работает. Пока что я не видел ни одного профилировщика, который на самом деле это делает. Ничто не заменит понимания, которое вы можете получить, изучив несколько случайных выборок стека. - person Mike Dunlavey; 22.07.2009

Анализатор задержки JRockit Mission Control.

Анализатор задержки, поставляемый с JRockit, показывает, что «делает» JVM, когда она ничего не делает. В последней версии вы можете увидеть задержки для:

  • Java ждет/заблокирован/спит/припаркован.
  • Файловый ввод/вывод
  • Сетевой ввод-вывод
  • Выделение памяти
  • Сборщик мусора приостанавливается
  • Задержки JVM, например генерация кода и загрузка классов
  • Резьбовая подвеска

Инструмент предоставит вам трассировку стека, когда возникла задержка. Вы можете просматривать данные о задержке разными способами (агрегированные трассировки, в виде гистограммы, на диаграмме потока и т. д.). Инструмент также позволяет вам видеть переходы между потоками, например, когда один поток уведомляет другой.

http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

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

Это бесплатно для использования в целях развития!

person Kire Haglin    schedule 29.09.2008

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

Люди обычно плохо угадывают, где находятся узкие места в производительности. Просто кажется, что это то, на что наш мозг не способен хорошо справляться. Это может показаться очевидным, у вас могут быть отличные идеи о том, в чем проблема, но в реальном мире часто получается что-то другое. А оптимизация неправильной части кода означает, в лучшем случае, много работы с минимальной выгодой. Чаще это замедляет работу, а иногда полностью ломает ее. Поэтому, прежде чем вносить какие-либо изменения в целях оптимизации, вы должны всегда иметь реальные доказательства от профилировщика или другого точного инструмента.

Как уже упоминалось, и JProfiler, и YourKit довольно хороши и не слишком дороги. В прошлый раз, когда я смотрел, у них обоих тоже были бесплатные демоверсии.

person Marcus Downing    schedule 21.08.2008

Для полноты картины: хотя моя компания более или менее стандартизирует Eclipse, мы используем Netbeans (6 и выше) с включенным бесплатным профилировщик ежедневно. Он работает лучше, чем плагин Eclipse TPTP (последний раз проверялся 3 месяца назад), и для нас он устраняет необходимость в коммерческом профилировщике, таком как JProfiler, который превосходен, но быстро становится ненужным.

person Boris Terzic    schedule 19.08.2008

VisualVM должен быть автономным профилировщиком из netbeans. Я попробовал TPTP для eclipse, но VisualVm кажется гораздо более удобным вариантом!

person svrist    schedule 21.08.2008