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

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

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


Обновлять:

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

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

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

Ответов (8)

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

анализатор задержки http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

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

Это бесплатно для разработки!