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

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


person Brandon Yarbrough    schedule 23.03.2009    source источник


Ответы (7)


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

person Mark    schedule 23.03.2009
comment
Обратите внимание, что Visual VM лучше всего работает с Sun JVM. Если первоначальный запрашивающий использует другую магию JVM, скорее всего, необходимо, чтобы Visual VM мог видеть и подключаться к запущенному процессу. - person Thorbjørn Ravn Andersen; 24.03.2009

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

person aledbf    schedule 23.03.2009

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

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

Wikipage на tomcat в Netbeans.

person Mark    schedule 23.03.2009

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

person Peter Lawrey    schedule 24.03.2009

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

person trunkc    schedule 24.03.2009

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

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

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

person Steve B.    schedule 23.03.2009
comment
Ну, наше приложение работает в приемлемых параметрах производительности, но я хотел заглянуть под капот, чтобы увидеть, есть ли какие-то очевидные узкие места, на которые я мог бы обратить внимание. Я слышал, что это никогда не бывает там, где вы ожидаете. - person Brandon Yarbrough; 23.03.2009

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

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

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

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

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

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

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

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

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

person Kai    schedule 24.03.2009