Подтвердить что ты не робот

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

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

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


Обновление:

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

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

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

4b9b3361

Ответ 1

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

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

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

Надеюсь, что поможет

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Анализатор латентности управления сеансом JRockit.

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

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

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

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

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

Он может использоваться для разработки!

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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