17
JVM изнутри Оптимизация и профилирование Константин Слисенко JazzTeam, Senior Software Engineer

JVM изнутри - оптимизация и профилирование

Embed Size (px)

DESCRIPTION

How to make a Java Virtual Machine tuning and profile java applications.

Citation preview

JVM изнутри

Оптимизация и профилирование

Константин СлисенкоJazzTeam, Senior Software Engineer

Сколько нужно программистов чтобы заменить сгоревшую

лампочку?

?+

Сколько нужно программистов чтобы заменить сгоревшую

лампочку?

?+Ни одного!

Это проблема железа.

О чём я расскажу● Внутреннее устройство JVM

○ Виды памяти○ Сборка мусора

● Оптимизация JVM○ Опции памяти○ Как избегать memory leaks

● Профилирование java-приложений○ Утилиты в составе JDK○ VisualVM

Память в JVM: stackОтдельный для каждого потока

Используется для хранения● Локальных переменных● Аргументов методов● Значений примитивных типов

(int, float, double, char, ...)

Настройка-Xss256k

Eden

Perm gen space

Heapspace

Stack

Survivor

Old

Thread 3

Thread 4

Thread 1

Thread 2

Память в JVM: heap spaceHeap используется для хранения объектов

Настройка-Xms256m - минимальный размер-Xmx512m - максимальный размер-XX:NewRatio=2 - соотношение eden + survivor/survivor

Eden● Молодые объекты● Когда переполняется, GC

выполняет быструю сборку мусора (затрагивается только эта область, выжившие объекты переносятся в survivor space)

● Хранит временные объекты внутри методов

Eden

Perm gen space

Heapspace

Stack

Survivor

Old

Thread 3

Thread 4

Thread 1

Thread 2

Память в JVM: heap spaceHeap используется для хранения объектов

Survivor● Объекты, пережившие одну

сборку мусора

Tenured generation● объекты, пережившие много

сборок мусора: менеджеры ресурсов, синглтоны

● при заполнении выполняется полная сборка мусора, она затрагивает все объекты JVM, дорогостоящий процесс

System.gc() вызывает полную сборку мусора

Eden

Perm gen space

Heapspace

Stack

Survivor

Old

Thread 3

Thread 4

Thread 1

Thread 2

Память в JVM: perm genPermanent generation

Хранение мета-информации о классах и методах

Настройка-XX:PermSize=32m-XX:MaxPermSize=128m

Изменение размера - дорогостоящая операция, лучше задать размер сразу

Eden

Perm gen space

Heapspace

Stack

Survivor

Old

Thread 3

Thread 4

Thread 1

Thread 2

Сборка мусораGarbage - структуры данных в памяти, к которым больше нет доступа из программы

Сборщик мусора - фоновый процесс, который освобождает память от мусора

Основные сборщики мусора

Copy collection● Самый простой алгоритм● Копируем нужные объекты из eden в survivor, чистим eden● Stop the world pauses

Mark sweep compact● mark - помечаем неиспользуемые объекты● sweep - удаляем их● compact - смещаем их к началу памяти

Memory leaksВозникают из-за забытых ссылок, особенно на "тяжёлые объекты"

// Some image loading functionality

Map<String, Bitmap> images = new HashMap<String, Bitmap>();

// We use this method for image cachingpublic Bitmap getBitmap(String name) {

if (!images.contains(name)) {// loadBitmap is slow operation, we use caching to speed up this processimages.put(name, loadBitmap(name));

}

return images.get(name);}

...

// Somewhere in the applicationgallery.onNext(new GalleryListener(Gallery g, String name) {

g.setImage(getBitmap(name));});

Ссылки на тяжёлые битмапы сохраняются, сборщик мусора не может очистить эти объекты, память переполняется

Как избегать memory leaksКеширование больших объектовИспользуйте weak и soft references

WeakReference - GC удаляет объект если на него нет "сильных" ссылокSoftReference - объект удаляется при нехватке памяти в системе

Оптимизируем пример

Map<String, WeakReference<Bitmap>> images = new HashMap<String, WeakReference<Bitmap>>();

// We use this method for image cachingpublic Bitmap getBitmap(String name) {

if (!images.contains(name) || images.get(name).get() == null) {// loadBitmap is slow operation, we use caching to speed up this processimages.put(name, new WeakReference(loadBitmap(name)));

}

return images.get(name);}

Как избегать memory leaksЗакрываем потоки, сокеты, соединения

OutputStream out = new FileOutputStream();try {

// Work with stream} finally {

out.close();}

PreparedStatement stmt = createStatement();ResultSet rs = null;try {

rs = stmt.executeQuery();// Work with result set

} finally {if (stmt != null) {

stmt.close();}

if (rs != null) {rs.close();

}}

ПрофилированиеАнализ работы программы● Замер времени на выполнения методов● Замер расходуемой памяти● Загрузка CPU

Цель● Нахождение "узких мест", далее

оптимизация● Определение утечек памяти, исправление

Профилирование в java

JMX - Java Management Extensions● Технология для управления и

мониторинга java-приложений● Работа как с локальными, так и с

удалёнными приложениями● Поддерживает авторизацию● VisualVM использует JMX

Утилиты в составе JDKjps - вывод списка JVM в системе

jinfo - вывод конфигурационной информации о java-процессе

jstack - вывод стектрейсов всех потоков java-процесса

jstat - сбор статистики производительности

jmap - сбор статистики используемой памяти

jhat - просмотр heap

VisualVM

Вопросы?

Спасибо за внимание!

Константин Слисенко[email protected]