2. 2
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
3. 3
Сборка мусора в JVM
• Прозрачна для приложения
> Только new()
• Влияние на работу приложения
> Производительность
> Предсказуемость
> Потребление памяти
4. 4
Предсказуемость
Возможность системы реагировать на запросы за
определенные промежутки времени
• В каких Java приложениях нужна
предсказуемость?
> Торговые площадки
> Колл-центры
> Интерактивные системы
5. 5
Почему возникают паузы?
java -XX:+PrintGC -XX:+PrintGCTimeStamps MyApp
80.083: [GC 4635390K->3725354K, 0.7574889 secs]
82.450: [Full GC 5684626K->4828292K, 17.1372078 secs]
Время реакции Full GC
17.13
82.450 Время работы
Полная сборка мусора (Full GC) –
возможный источник пауз
6. 6
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
7. 7
Основные понятия
• Stop The World (STW) пауза
> Режим VM, требующий полной остановки приложения
• Roots (Активные объекты)
> Изначально достижимые объекты
– Стеки, глобальные переменные, и т.д.
• Parallel GC/Параллельная сборка
> В нескольких потоках одновременно, в режиме паузы
• Concurrent GC/Фоновая сборка
> Одновременно с приложением в другом потоке
8. 8
Цветовые обозначения
Живые (достижимые) объекты
Мертвые (недостижимые) объекты
Неиспользуемая (неактивная) область памяти
Roots (Изначально достижимые объекты)
Используемая (активная) область памяти
9. 9
Stop & Copy
• Copy
> Живые объекты копируются в неактивную область
памяти
> Неактивная область становится активной (и наоборот)
• Требует дополнительной памяти
• Время зависит от живых объектов
• Быстрая аллокация
> “Сдвиг указателя”
10. 10
Mark & Sweep
• Mark
> Помечаются все живые объекты
• Sweep
> Помечается неиспользуемое место
• Возможен в фоновом режиме
> Очень низкая скорость сборки
• Фрагментация памяти
• Медленная аллокация
> Списки свободной памяти
V VV
X X
11. 11
Mark Sweep Compact
• Mark
> Помечаются живые объекты
• Sweep
> Помечаются мертвые объекты
• Compact
> Живые объекты переносятся в
свободную область
• Быстрая аллокация памяти
> “Сдвиг указателя”
• Низкая скорость сборки
V VV
X X
12. 12
Слабая гипотеза о поколениях
• Основана на 2 наблюдениях
> Большинство объектов умирают молодыми
> Мало ссылок из старых объектов на молодые
• Вся память разбита на поколения
> Обычно 2 поколения – молодое и старшее
> Молодое поколение собирается отдельно
> Пережившие несколько сборок объекты переходят
из молодого поколения в старшее
• Используется всеми сборщиками в HotSpot VM
13. 13
Что такое Full GC?
roots Heap
Молодое поколение
Stop & Copy
быстро
часто
Старшее поколение
Mark Sweep Compact
медленно
редко
Full GC:
сборка старшего поколения
14. 14
Сборщики мусора в HotSpot JVM
• Производительные
> -XX:+UseParallelGC, -XX:+UseParallelOldGC, ...
> Редкие полные сборки (Full GC) не ухудшают
общую производительность
• Предсказуемый
> -XX:+UseConcMarkSweep (CMS)
> В старшем поколении используется
Mark & Sweep в фоновом режиме
– Фрагментация
– Низкая производительность
– Возможна полная сборка мусора (Full GC)
15. 15
Проблема Full GC
• Требуется во всех сборщиках HotSpot VM
• Требует остановки приложения
• Длительная операция
> Используется вся память
> Скорость доступа к памяти ограниченна
• Основной источник пауз в HotSpot VM
Необходим новый сборщик мусора, позволяющий
избежать полной сборки
16. 16
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
17. 17
Как работает G1?
• Вся память разбита на регионы
> Размер региона по умолчанию – 1MB
> “Большие” объекты (>500KB) используют
смежные регионы целиком
• Сборка мусора производится
эвакуацией регионов
> Живые объекты копируются в другие
регионы
> Освобожденные регионы используются для
повторного выделения объектов
18. 18
Эвакуация региона
• Используется алгоритм копирования
> Копирование живых объектов
> Обновление соответствующих ссылок
• Информация о внешних ссылках на объекты внутри
региона – Remembered Set
> Позволяет при обновлении ссылок не исследовать
всю память
Эвакуация объектов из 2 регионов в 1 новый
Remembered
Sets
19. 19
G1: Сборка мусора
Старшее
поколение
Неиспользуемая память
• Основан на поколениях
> Поколения - множества регионов
• Сборка молодого поколения
> Эвакуация всех молодых регионов
• Сборка старшего поколения
> Эвакуация наименнее занятых
регионов
Молодое
поколение
Новые регионы в молодом
поколении
Новые регионы в старшем
поколении
20. 20
Сборка молодого поколения
• При сборке происходит
эвакуация всех регионов
• Используется Stop & Copy
> Быстрое выделение памяти
“сдвиг указателя”
• Размер молодого поколения
легко менять “на лету”
21. 21
Сборка молодого поколения
• При эвакуации объекты
копируются:
> Пережившие несколько сборок –
в старшее поколение
> Остальные - в молодое
поколение
22. 22
Сборка старшего поколения
• Помечаются все живые объекты
> Фаза Mark из Mark & Sweep
> В фоновом режиме
• Подсчитывается количество живых
объектов в регионах
• Освобождаются регионы без живых
объектов
• Выбираются объекты для эвакуации
> Содержащие наименьшее
количество живых объектов
23. 23
Сборка старшего поколения
• Одновременно с последующей
сборкой молодого поколения
> Эвакуируются наименее занятые
регионы
> Объекты копируются в старшее
поколение
24. 24
Сборка старшего поколения
• Постоянная сборка в старшем
поколении
> Отсутствие фрагментации
• Полная сборка не требуется
> Возможна при нехватке ресурсов
Основная идея Garbage First :
“Мусор в первую очередь”
25. 25
Предсказуемость в G1
• Задаваемые желаемые паузы
> Высокая вероятность, но не 100%
• Отсутствие фрагментации
> Важно для серверных приложений
• Автоматическая настройка
> Размеры очищаемой памяти в зависимости
от желаемой паузы
26. 26
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
29. 29
Возможные причины Full GC
• Недостаток ресурсов
> Добавьте больше памяти или проц. времени
• Сборка классов
> Следите за загрузкой/выгрузкой классов
• Большие объекты
> Старайтесь не создавать объекты более 500К
• Явный вызов System.gc()
> -XX:+DisableExplicitGC
30. 30
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
31. 31
Сборщик G1 в HotSpot JVM
• Желаемые временные ограничения
• Простая настройка
• Приемлемая производительность
• Масштабируемость
• Подходит для серверных приложений с
ограниченным временем реакции
• Замена ConcurrentMarkSweep (CMS)
32. 32
G1 и Real Time
• G1 != Real Time
> Небходима OC реального времени
> Планировщик потоков
> И многое другое ...
• Используйте Java Real-Time System
> Real Time GC (RTGC)
33. 33
G1 среди остальных сборщиков
Скорость
Предсказуемость
G1
CMS
RTGC
Parallel GC
G1 – замена CMS
34. 34
Ссылки
• OpenJDK
> http://download.java.net/openjdk/jdk7
> http://hg.openjdk.java.net/jdk7/hotspot/hotspot
• Статьи и блоги разработчиков
> http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf
> http://blogs.sun.com/jonthecollector/entry/our_collectors
> http://blogs.sun.com/tony/