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

StackOverflow https://stackoverflow.com/questions/12927

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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


Обновить:

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Пресса CTRL+ПЕРЕРЫВ под Окнами
  • Отправить kill -3 <process id> под управлением Linux

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top