Вы находитесь на странице: 1из 52

“Эффективное решение проблем

производительности Java-программ с
применением YourKit Java Profiler”

Докладчик:

Антон Катилин
создатель YourKit Java Profiler
Проблемы производительности:


Программа работает медленно

Программа потребляет много памяти и/или
происходят утечки памяти

Профилирование - решение проблем


производительности измерительным методом.

Эффективнее аналитического и имитационного.


YourKit Java Profiler

http://www.yourkit.com

Текущая версия: 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
Контакты

Узнать больше, попробовать:


http://www.yourkit.com

Обсудить, критиковать, предлагать:


http://forums.yourkit.com

Anton Katilin

anton@yourkit.com