jvm изнутри - оптимизация и профилирование
DESCRIPTION
How to make a Java Virtual Machine tuning and profile java applications.TRANSCRIPT
О чём я расскажу● Внутреннее устройство 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