Если у вас есть приложение Java, которое потребляет ресурсы ЦП, когда ничего не делает, как определить, что оно делает?
Я вызываю API Java поставщика, и на некоторых серверах кажется, что JVM переходит в цикл опроса с низким приоритетом после входа в API (ЦП при 100% использовании). То же приложение на других серверах не демонстрирует такого поведения. Это происходит в WebSphere и Tomcat. Среду сложно настроить, поэтому сложно попытаться сделать что-то вроде профилирования в Eclipse.
Есть ли способ профилировать (или какой-либо другой метод проверки) существующее приложение Java, работающее в Tomcat, чтобы узнать, какие методы выполняются, пока оно находится в этом состоянии типа spinwait? Когда приложение переходит в это состояние, оно выполняет только один метод (метод поставщика). Поставщик не может воспроизвести поведение (конечно).
Обновлять:
Используя JConsole, я смог определить, кто работает и что они делают. Мне потребовалось несколько часов, чтобы понять, почему он это делает. В конечном итоге проблема заключалась в том, что используемый поставщик jar API-интерфейса не соответствовал в точности конфигурации базы данных, которую он использовал. По умолчанию на серверах с незначительным несоответствием в конфигурации были включены трассировка и мониторинг производительности. Я использовал другую банку, и все хорошо.
Так что спасибо, Джошуа, за твой ответ. JConsole было чрезвычайно легко настроить и использовать для мониторинга существующего приложения.
@Cringe - Я экспериментировал с некоторыми из предложенных вами вариантов. У меня возникли проблемы с настройкой JProfiler, выглядит неплохо (но дорого). Забегая вперед, я добавил плагин Eclipse Profiler, и я буду просматривать различные профилировщики с открытым исходным кодом, чтобы сравнить функциональность.
Ответов (8)8
Если вы используете Java 5 или новее, вы можете подключиться к своему приложению с помощью jconsole для просмотра всех запущенных потоков. jstack также сделает дамп стека. Я думаю, что это должно работать даже внутри контейнера, такого как Tomcat.
Оба этих инструмента включены в JDK5 и более поздние версии (я предполагаю, что процесс должен быть не ниже Java 5, хотя я могу ошибаться)
Обновление: также стоит отметить, что, начиная с обновления 7 JDK 1.6, теперь имеется встроенный профилировщик под названием VisualVM, который можно запустить с помощью jvisualvm. Похоже, это проект java.net , поэтому на этой странице может быть доступна дополнительная информация. Я этим еще не пользовался, но он кажется полезным для более серьезного анализа.
надеюсь, это поможет
Если это для профессиональных целей и у вас есть деньги, которые можно потратить, попробуйте заполучить 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 довольно хороши и не слишком дороги. Когда я в последний раз смотрел, у них обоих тоже были бесплатные демо.
Анализатор задержки JRockit Mission Control.
Анализатор задержки, поставляемый с JRockit, показывает, что JVM «делает», когда ничего не делает. В последней версии вы можете увидеть задержки для:
- Java ждет / заблокирован / спит / припаркован.
- Файловый ввод / вывод
- Сетевой ввод / вывод
- Выделение памяти
- GC приостанавливает работу
- Задержки JVM, например, генерация кода и загрузка классов
- Подвеска резьбы
Инструмент предоставит вам трассировку стека, когда возникнет задержка. Вы можете просматривать данные о задержке разными способами (агрегированные трассировки, в виде гистограммы, в виде графика потока и т. Д.). Инструмент также позволяет вам видеть переходы между потоками, например, когда один поток уведомляет другой.
Накладные расходы незначительны и, в отличие от многих других инструментов, могут использоваться в производственной среде. Это сообщение в блоге дает вам краткое введение, программу можно скачать здесь .
Это бесплатно для разработки!