У меня есть очень большое приложение Java. Он работает на Tomcat и является типичным веб-приложением Spring/Hibernate. Это также очень большая программа на Java. Мне несложно проверить производительность запросов к базе данных, поскольку я могу запускать их по отдельности, но я понятия не имею, как искать узкие места Java в таком стеке. Я попробовал Eclipse's TPTP profiler, но ему действительно не понравилась моя программа, и я подозреваю, что это потому, что моя программа слишком велика. Есть ли у кого-нибудь совет по профилированию большого веб-приложения?
Как я могу профилировать очень большое веб-приложение Java?
Ответы (7)
Профилировщик Visual VM, который теперь поставляется с JDK, может быть подключен к запущенным процессам и, по крайней мере, может дать первоначальный обзор производительности. Он основан на профилировщике Netbeans.
Если вы можете запустить Tomcat и свое приложение в Netbeans.
Затем вы можете использовать встроенный в Netbeans профилировщик для проверки производительности, использования памяти и т. д.
Wikipage на tomcat в Netbeans.
Я использовал YourKit для профилирования приложений с 8-гигабайтной кучей, и это сработало достаточно хорошо.
Проверьте JAMon. Это не профилировщик, но это лучший инструмент для профилирования, который я могу порекомендовать. Интеграция с Spring очень проста. Мы используем его в тестовой и живой среде.
Я никогда не находил простого способа сделать это, потому что обычно происходит так много всего, что трудно получить четкую общую картину. С такими вещами, как Hibernate, тем более, потому что правильным поведением может быть захват большого куска памяти для кэшированных данных, даже если ваше приложение на самом деле ничего не делает, поэтому другой неэффективный процесс памяти, который вы запускаете, может быть завален профилированием.
Вы профилируете память, скорость или просто ищете низкую производительность? Попробуйте протестировать процессы, которые, как вы подозреваете, плохие, изолированно, это, безусловно, намного проще.
JProbe, JProfiler, оба хорошие, бесплатные демо доступны. Тестирование внутри IDE усложняет проблемы с памятью, мне проще было не заморачиваться.
Попробуйте JProfiler. У него есть пробная лицензия, и он очень полнофункциональный. Чтобы использовать его, вам нужно:
- Добавьте агент JProfiler в качестве аргумента в команду Java.
- Запустить программу на сервере
- Запустите JProfiler и выберите «Подключиться к удаленному приложению».
- Дайте ему номер порта и хост, на котором он работает.
Все это есть в инструкциях, которые поставляются с JProfiler, но важная часть заключается в том, что вы будете подключаться через хост и портировать свое работающее приложение.
Что касается профилирования, я уверен, что у вас есть представление о вещах, которые могут интенсивно использовать память/ЦП — загрузка больших наборов данных, сортировка, даже простой сетевой ввод-вывод, если это сделано неправильно. Сделайте эти вещи (хорошо, если вы можете автоматизировать нагрузочное тестирование с помощью некоторых скриптов, которые работают на вашем сервере) и соберите снимок с помощью JProfiler.
Затем просмотрите графики на досуге. Включите мониторинг процессора и посмотрите, на что тратятся циклы процессора. Вы сможете сузить процент в каждом вызове метода, поэтому, если вы используете более 1 или 2% ЦП в методах, для которых у вас есть исходный код, изучите и посмотрите, можете ли вы сделать их менее интенсивно использующими ЦП.
То же самое касается памяти. Отключите все профилирование ЦП, включите все профилирование памяти, снова запустите тесты и получите снимок.
Смыть, повторить.
Вы также можете потратить это время, чтобы прочитать об управлении памятью и сборке мусора. Нет лучшего времени для настройки сборки мусора, чем когда вы уже профилируете: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
Обратите особое внимание на часть, посвященную продвижению объекта Эдем/Выживший. В веб-приложениях вы получаете много недолговечных объектов, поэтому часто имеет смысл увеличивать количество молодых поколений за счет постоянных поколений.