Эффективное решение проблем производительности Java-программ с применением YourKit Java Profiler Докладчик: Антон Катилин создатель YourKit Java Profiler
Проблемы производительности: Программа работает медленно Программа потребляет много памяти и/или происходят утечки памяти Профилирование - решение проблем производительности измерительным методом. Эффективнее аналитического и имитационного.
YourKit Java Profiler Текущая версия: 3.2
Область применения YourKit Java Profiler: Java 1.3, 1.4, 5.0 J2SE, J2EE - версия 3 J2ME - версия 4 Windows, Linux, Solaris SPARC - версия 3 Mac OS X, Solaris PC - версия 4
Как устроен профайлер: Агент Клиент с пользовательским интерфейсом API для автоматизации профилирования
Агент: Библиотека (dll, so), написана на C/C++ Загружается при старте VM Взаимодействует с VM с использованием протоколов: JVMPI (до Java 5.0 включительно) и JVMTI (начиная с Java 5.0) Управляется извне через сокет Сохраняет результаты в файл (снепшоты)
Клиент: Предоставляет пользовательский интерфейс Взаимодействие с агентом: переключение режимов профилирования, запись результатов измерений в файл (получение снепшотов) Визуализация результатов профилирования
2 группы задач: профилирование памяти профилирование CPU
Вопрос: зачем заниматься исследованием потребления памяти, если существует автоматическая сборка мусора?
Ответ: эффективность потребления памяти Java программой может существенно влиять на производительность и надежность этой программы
Причина 1: В случае невозможности выделить память под новый объект возникает OutOfMemoryError Аварийное завершение программы или ее дальнейшая нестабильная работа Возможна потеря результатов работы и/или повреждение файлов данных
Причина 2: Использование больших объемов памяти может привести к увеличению частоты обращения ОС к файлу подкачки Общее снижение производительности системы
Причина 3 При создании большого количества временных объектов VM тратит больше времени на сборку мусора Пример: конкатенация строк
Задачи, решаемые профилировнием памяти: Обнаружение и локализация утечек памяти Выявление "жадных" подсистем Поиск кода, порождающего много временных объектов
Что такое memory leak в Java? Автоматически уничтожаются объекты, не доступные из GC roots Объекты могут оставаться доступными по ссылкам, потому что программист забыл убрать на них ссылки
Утечки памяти не могут быть обнаружены полностью автоматически Сборка мусора – формальный алгоритм Memory leak – понятие семантическое
Пример memory leak: Компонент класса Application Компоненты класса Project Application хранит список обработчиков событий, каждый из которых имеет ссылку на объект Если обработчик не удаляется из списка, Project не может быть собран
О слежении за созданием объектов (Allocation recording) Замедляет профилируемую программу Полученные данные бесполезны для решения задачи 1 и 2: не важно "где" создан объект, важно "почему" он существует, т.е. какими ссылками он удерживается
В YourKit Java Profiler allocation recording - опция, по умолчанию выключенная С агентом YourKit Java Profiler можно запустить любую программу без потери производительности, получив возможность профилировать память при возникновении необходимости
Как найти и устранить утечку памяти: 0. Программа запущена с агентом профайлера -Xrunyjpagent в командной строке Запуск из IDE Интеграция с J2EE сервером
Как найти и устранить утечку памяти: 1. Коннект к агенту, сохранение снепшота, открытие снепшота в клиенте
Как найти и устранить утечку памяти: 2. Найти объекты интересующего нас класса (Ctrl+N)
Как найти и устранить утечку памяти: 3. Найти пути (Ctrl+P)
Как найти и устранить утечку памяти: 4. Перейти в редактор IDE чтобы устранить проблему F7
Вопрос: Класс объекта был известен заранее. А что делать, если это не так?
Ответ: 1. Часто классы объектов, имеющих "тенденцию" быть утечками памяти, хорошо известны разработчику (e.g. Project in IntelliJ IDEA)
Ответ: 2. Сравнение двух состояний памяти: еще без утечки и уже с утечкой
Ответ: 3. С использованием одного снепшота: анализ распределения числа объектов и размеров занимаемой памяти среди объектов разных классов
Анализ распределения памяти между подсистемами Отвечаем на вопрос Куда ушла вся память? Понятия shallow и retained size
Шаги: 0. Программа запущена с агентом 1. Получить и загрузить снепшот 2. Использовать 'Class tree'
'Class tree': Статистика по пакетам и классам Деление по пакетам зачастую отражает деление по подсистемам package = subsystem Получем достаточно представительную оценку распределения занимаемой памяти
Таким образом, YourKit Java Profiler позволяет находить утечки памяти и анализировать потребление памяти в реально работающих системах, с реальными нагрузками.
Поиск кода, порождающего много временных объектов (Excessive garbage allocation) Allocation recording включается только на необходимый период времени, все остальное время программы работает с полной скоростью Анализ hot spots и call trees методов, порождавших временные объекты Если снепшот получен со включенным allocation recording, можно анализировать распределение объектов (hot spots, call trees) по местам их создания в коде
Профилирование CPU 2 метода профилирования: sampling tracing включается/выключается явно - возможно профилирование реально работающих систем понятие снепшота
Sampling: периодически (десятки раз в секунду) опрашиваются стеки всех ниток с учетом интервалов между опросами оценивается проведенное в методах время Минимальное влияние на производительность профилируемой программы Точность достаточна в большинстве случаем для выявления узких мест
Tracing: замеряются времена входа и выхода в метод Замедление работы программы может быть существенным. Доступно число вызовов методов. Вывод: sampling – лучший выбор в большинстве случаев
Пользовательский интерфейс для анализа результатов профилирования CPU Hot Spots Call Trees (by thread, threads together) про каждый конкретный метод можно узнать: - merged callees - back traces - invocation points
Hot Spots
Call Trees (by threads, all threads together)
Про каждый конкретный метод можно узнать: Merged callees
Про каждый конкретный метод можно узнать: Back traces
Про каждый конкретный метод можно узнать: Invocation points
Прочие полезные особенности YourKit Java Profiler
Интерфейс Уделяется большое внимание Удобство работы с клавиатуры Swing
Фильтрация: деление на "интересные" и "неинтересные" методы java.lang.*, javax.swing.* другие профайлеры: задание фильтров перед измерением YourKit Java Profiler: фильтр - понятие пользовательского интерфейса
Плюсы подхода YourKit Java Profiler: от человека не требуется принимать решение заранее человек имеет возможность передумать как результат, экономится время и усилия человека
Архитектура агент - клиент естественным образом обеспечивает возможность профилирования как локальных, так и удаленных приложений В текущей версии снепшоты сохраняются в файловой системе удаленного хоста В версии 4 – возможность передачи снепшота по сети
Поддержка J2EE Профилирование серверов под реальной нагрузкой Автоматизированное конфигурирование ряда серверов: Tomcat, JBoss, WebLogic, JRun, Resin, Orion и др.
Интеграция профайлера и IDE Задачи: Запуск профилируемой программы Доступ к исходному тексту профилируемой программы
Особенности интеграции YourKit Java Profiler с IDE Плагин к IDE (IntelliJ IDEA, Eclipse, JBuilder, JDeveloper) Запуск приложения, задание параметров Профайлер – самостоятельная программа (standalone profiler UI) Навигация к коду в редакторе IDE
Некоторые ближайшие планы: Wall и CPU times J2ME Поддержка платформ: Mac OS X, Solaris PC NetBeans динамическая информация.Net
Контакты Узнать больше, попробовать: Обсудить, критиковать, предлагать: Anton Katilin