Как я могу профилировать очень большое Java-приложение? - PullRequest
4 голосов
/ 23 марта 2009

У меня очень большое Java-приложение. Он работает на Tomcat и является вашим типичным приложением для Spring / Hibernate. Это также чрезвычайно большая Java-программа. Мне легко проверить производительность запросов к базе данных, так как я могу выполнять их отдельно, но я не имею ни малейшего представления, чтобы искать узкие места Java в стеке, как это. Я попробовал профилировщик TPTP в Eclipse, но мне, похоже, не понравилась моя программа, и я подозреваю, что это потому, что моя программа слишком велика. У кого-нибудь есть советы по профилированию большого веб-приложения?

Ответы [ 8 ]

4 голосов
/ 23 марта 2009

Профилировщик Visual VM , который теперь поставляется с JDK, может быть подключен к запущенным процессам и может по крайней мере дать начальный обзор производительности. Он основан на профилировщике Netbeans.

1 голос
/ 24 марта 2009

Проверка JAMon . Это не профилировщик, но это лучший инструмент для профилирования, который я могу порекомендовать. Это очень легко интегрировать с пружиной. Мы используем его в тестовой и живой среде.

1 голос
/ 24 марта 2009

Я использовал YourKit для профилирования приложений с кучей 8 ГБ, и это работало довольно хорошо.

1 голос
/ 23 марта 2009

Если вы можете запустить Tomcat и ваше приложение в Netbeans .

Затем вы можете использовать встроенный в Netbeans профилировщик для проверки производительности, использования памяти и т. Д ...

Wikipage на кота в Netbeans.

1 голос
/ 23 марта 2009

Попробуйте jProfiler. Его легко интегрировать с Tomcat

0 голосов
/ 24 марта 2009

Попробуйте JProfiler . Он имеет пробную лицензию и очень полнофункциональный. Чтобы использовать его, вам необходимо:

  • Добавьте агента JProfiler в качестве аргумента в команду java
  • Запустить программу на сервере
  • Запустите JProfiler и выберите «Подключиться к приложению, работающему удаленно»
  • Дайте ему номер порта и хост, на котором он работает

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

Что касается профилирования, я уверен, что у вас есть представление о том, что может потребовать значительных ресурсов памяти / ЦП - загрузка больших наборов данных, сортировка, даже простой сетевой ввод-вывод, если он сделан неправильно. Сделайте эти вещи (это здорово, если вы можете автоматизировать нагрузочное тестирование, используя несколько скриптов, которые работают на вашем сервере) и собрать снимок с помощью JProfiler.

Тогда просматривайте графики на досуге. Включите мониторинг ЦП и посмотрите, где расходуются циклы ЦП. Вы сможете сузить процентное соотношение при каждом вызове метода, поэтому, если вы используете более 1 или 2% ЦП в методах, для которых у вас есть источник, изучите и посмотрите, сможете ли вы сделать их менее ресурсоемкими.

То же самое касается памяти. Отключите все профилирование процессора, включите все профилирование памяти, снова запустите тесты и получите снимок.

Промыть, повторить.

Возможно, вам также понадобится время, чтобы ознакомиться с управлением памятью и сборкой мусора. Нет лучшего времени для настройки сборки мусора, чем когда вы уже профилируете: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Особое внимание уделите роли в продвижении объекта Эдем / Выживший. В веб-приложениях вы получаете много недолговечных объектов, поэтому часто имеет смысл увеличивать молодое поколение за счет постоянных поколений.

0 голосов
/ 24 марта 2009

Попробуйте это. Возможно, это проще, чем вы ожидаете, но это работает.

0 голосов
/ 23 марта 2009

Я никогда не находил простой способ сделать это, потому что обычно так много всего происходит, что трудно получить четкую общую картину. С такими вещами, как Hibernate, тем более, что правильное поведение может заключаться в том, чтобы захватить большой кусок памяти для кэшированных данных, даже если ваше приложение на самом деле ничего не «делает», поэтому другой неэффективный процесс памяти, который вы запускаете, может быть затоплен при профилировании. 1001 *

Вы профилируете по памяти, скорости или просто ищете низкую производительность? Попробуйте протестировать процессы, которые вы подозреваете, плохо в изоляции, это, безусловно, гораздо проще.

JProbe, JProfiler, доступны как хорошие, так и бесплатные демоверсии. Тестирование внутри IDE усложняет проблемы с памятью, мне было проще не беспокоиться.

...