Если у вас есть приложение Java, которое потребляет процессор, когда оно ничего не делает, как вы определяете, что он делает?
Я вызываю API-интерфейс поставщика, и на некоторых серверах кажется, что JVM переходит в низкопрофильный цикл опроса после входа в API (процессор со 100% -ным использованием). Такое же приложение на других серверах не демонстрирует такого поведения. Это происходит в WebSphere и Tomcat. Среда сложна для настройки, поэтому трудно попытаться сделать что-то вроде профилирования в Eclipse.
Есть ли способ профилировать (или какой-либо другой метод проверки) существующее Java-приложение, запущенное в Tomcat, чтобы узнать, какие методы выполняются, пока он находится в состоянии этого спинвейта? Приложение выполняет только один метод, когда он попадает в это состояние (метод поставщика). Поставщик не может воспроизвести поведение (конечно).
Обновление:
Используя JConsole, я смог определить, кто работает и что они делают. Мне потребовалось несколько часов, чтобы понять, почему это происходит. Проблема заключалась в том, что используемая банком API поставщика не соответствовала точно той конфигурации базы данных, которую она использовала. Он не выполнял проверку трассировки и контроля производительности на серверах, которые имели незначительное несоответствие в конфигурации. Я использовал другую банку, и все хорошо.
Итак, спасибо, Джошуа, за ваш ответ. JConsole был чрезвычайно прост в настройке и использовании для мониторинга существующего приложения.
@Cringe - Я несколько экспериментировал с некоторыми из предложенных вами опций. У меня возникли проблемы с настройкой JProfiler, это выглядит хорошо (но дорого). Вперед, я пошел вперед и добавил плагин Eclipse Profiler, и я буду изучать различные профилировщики с открытым исходным кодом для сравнения функциональности.
Ответы
Ответ 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 кажется гораздо более приятным вариантом!