SlideShare a Scribd company logo
1 of 73
Download to read offline
© 2008 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Диагностирование проблем и настройка GC в HotSpot JVM
Владимир Иванов
Oracle Corporation
Vladimir.x.Ivanov@oracle.com
21.05.2011
The First Rule of Program Optimization:
Don't do it.
–Michael A. Jackson
(not the singer!)
The Second Rule of Program Optimization
(for experts only!):
Don't do it yet.
–Michael A. Jackson
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Сборка мусора (GC)
• Находит и освобождает место, занимаемое
ненужными объектами
• Объекты вне транзитивного замыкания, включающего
roots (стеки потоков, статические поля классов и т.д.)
• Автоматическая и безопасная
• Проще, если граф объектов “заморожен”
• Stop-the-world (STW) паузы
• Возможны различные подходы
• c дефрагментацией или без
• Алгоритмы: copying, mark-sweep, mark-compact, ...
• Аллокация: linear, free lists, ...
Сборка мусора с поколениями (I)
• Слабая гипотеза о поколениях
• Большинство объектов временные
• Старые объекты редко ссылаются на молодые
• Молодые и старые объекты содержатся отдельно
• В пространствах называемых “поколения” (generations)
• Возможны разные алгоритмы для молодого и старого
поколения
• Mолодое поколение можно собирать отдельно от старого
Сборка мусора с поколениями (II)
Молодое поколение
Старшее поколение
Продвижение объектов
Аллокация объектов
Необходимо
отслеживать ссылки
GC в Hotspot
• SerialGC
• последовательная сборка молодого и старого поколений
• ParallelGC
• максимальный throughput
• параллельная сборка молодого и старого поколений
• CMS
• предсказуемость
• по возможности, сборка мусора в фоновом режиме
• G1
• предсказуемость
• слабо подвержен фрагментации
• прямой конкурент CMS
GC в Hotspot: о чем будем говорить
• SerialGC
• последовательная сборка молодого и старого поколений
• ParallelGC
• максимальный throughput
• параллельная сборка молодого и старого поколений
• CMS
• предсказуемость
• по возможности, сборка мусора в фоновом режиме
• G1
• предсказуемость
• слабо подвержен фрагментации
• прямой конкурент CMS
ParallelGC: описание
• Молодое поколение: параллельный копирующий GC
• Старшее поколение: параллельный Mark-Compact GC
• Аллокация: линейная
• -XX:+UseParallelGC -XX:+UseParallelOldGC
Concurrent Mark Sweep: описание
• Молодое поколение: параллельный копирующий GC
• Старшее поколение: фоновый Mark-Sweep GC
• Аллокация: free-листы
• Компактификация только при Full GC
• -XX:+UseConcMarkSweep
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Диагностический вывод GC
• Параметры VM
• -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:<file>
• -XX:+PrintGCDateStamps
• -XX:+PrintHeapAtGC
• Минимальные накладные расходы
• Анализ диагностического вывода GC
• PrintGCStats
• GChisto: http://gchisto.dev.java.net/
VisualVM / VisualGC
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Идеальный сборщик мусора
• Не прерывает работу приложения
• Использует ровно столько оперативной памяти,
сколько нужно приложению
• Не требует дополнительных вычислительных
ресурсов
Производительность GC
• 3 характеристики
• Throughput
• Объем вычислительных ресурсов, затрачиваемых на GC
• Предсказуемость
• На какое время прерывается работа приложения
• Footprint
• Объем используемой памяти
Принципы настройки GC
• Чем больше доступно памяти GC, тем лучше
• Оптимизировать по 2 параметрам из 3
• Throughput
• Длительность пауз
• Объем используемой памяти
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Критерии выбора размера хипа
• Чем больше памяти, тем лучше для GC
• Как для молодого, так и для старшего поколения
• Более редкие сборки
• Ниже затраты на сборку мусора
• Доступный объем памяти ограничен
• Физическая память
• 32-битный режим
• Наличие других приложений в системе
Размеры поколений
• Размер молодого поколения
• Определяет частоту малых сборок (Minor GC)
• Влияет на то, сколько объектов умирает, не покидая
молодое поколении
• Размер старшего поколения
• Определяет частоту полных сборок (Full GC)
• Не меньше суммарного размера долгоживущих объектов,
используемых приложением в стабильном состоянии
Управление размерами поколений
Survivor
Tenured PermGen
-XX:MaxNewSize
Survivor
Eden
-XX:PermSize-XX:NewSize
-XX:MaxPermSize
-Xms
-Xmx
Молодое поколение (Young Gen)
Старшее поколение (Old Gen)
Permanent Generation (Perm Gen)
Размер хипа: основные цели
• Объем используемой памяти не должен
превышать объем физической памяти
• Максимизировать объем памяти, освобождаемый
при малых и полных GC
• Относится ко всем GC
Размер хипа: с чего лучше начать?
• LDS = Live Data Size
• размер множества достижимых объектов
• для приложение в стабильном состоянии
• -Xms / -Xmx = 3-4x LDS
• -XX:PermSize = 1.2-1.5x от макс. размера PermGen
• Размеры поколений
• Молодое поколение: -Xmn = 1-1.5x LDS
• Старшее поколение: -Xmx = 2-3x LDS + -Xmn
• Пример:
Если LDS == 512m, тогда -Xmn768m -Xms2g -Xmx2g
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Структура молодого поколения
Молодое поколение: сборка мусора (I)
Молодое поколение: сборка мусора (II)
Перемещение в старшее поколение
• Временные объекты
должны умирать в
молодом поколении
• Долгоживущие объекты
должны попадать в старшее поколение как можно
раньше
Время жизни объектов
Возраст
Живыеобъекты
Живыеобъекты
(размер)
Возраст
(кол-во GC)
1 2 3 4 5
Регион Eden (Young Gen)
Регион Survivor (Young Gen)
Старшее поколение (Old / Tenured Gen)
Время жизни объектов:
Как должно быть
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Возраст (age) – количество пережитых малых GC
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Суммарный размер объектов определенного
возраста
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Суммарный размер объектов, не старше
определенного возраста
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Общий размер объектов в Survivor пространстве
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Эффективный размер Survivor пространства
• == (Размер Survivor) x TargetSurvivorRatio
• -XX:TargetSurvivorRatio=<percent> ([1..100])
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Текущий пороговый возраст копирования в старшее
поколение
Время жизни объектов
• -XX:+PrintTenuringDistribution
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
• Максимальный пороговый возраст копирования
• -XX:MaxTenuringThreshold (MTT)
Время жизни объектов:
Как должно быть
Desired survivor size 6684672 bytes, new threshold 8 (max 8)
- age 1: 2315488 bytes, 2315488 total
- age 2: 19528 bytes, 2335016 total
- age 3: 96 bytes, 2335112 total
- age 4: 32 bytes, 2335144 total
Время жизни объектов:
Как бывает (I)
Desired survivor size 3342336 bytes, new threshold 1 (max 6)
- age 1: 3956928 bytes, 3956928 total
Время жизни объектов:
Как бывает (I)
Вывод: размер Survivor слишком мал.
Решение: увеличить размер Survivor и/или Eden.
• -XX:MaxNewSize / -Xmn
• -XX:SurvivorRatio=<ratio>
соотношение между Eden и Survivor
Desired survivor size 3342336 bytes, new threshold 1 (max 6)
- age 1: 3956928 bytes, 3956928 total
Время жизни объектов:
Как бывает (II)
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
Время жизни объектов:
Как бывает (II)
Вывод: настройки не оптимальны.
Решение: 2 варианта:
• Увеличить MTT: 6 → [7...]
• Установить MTT = 2
Desired survivor size 3342336 bytes, new threshold 6 (max 6)
- age 1: 2483440 bytes, 2483440 total
- age 2: 501240 bytes, 2984680 total
- age 3: 50016 bytes, 3034696 total
- age 4: 49088 bytes, 3083784 total
- age 5: 48616 bytes, 3132400 total
- age 6: 50128 bytes, 3182528 total
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Паузы: Молодое поколение
• Продолжительность малых сборок
• Часто является причиной задержек, вызванных GC
• Важна как продолжительность, так и частота
• Малые сборки
продолжительны → ↓ размер молодого поколения
часты → ↑ размер молодого поколения
Паузы: Старшее поколение (I)
• ParallelOldGC vs CMS
• ParallelOldGC может удовлетворять достаточно жестким
ограничениям на длительность пауз
• NB!
прежде чем использовать CMS убедитесь, что
ParallelOldGC не подходит
Паузы: Старшее поколение (II)
• -XX:+UseParallelOldGC
• -XX:ParallelGCThreads=<num>
Паузы: Старшее поколение (III)
• Частые полные сборки → ↑ размер старшего
поколения
• постарайтесь зафиксировать размер молодого поколения
• Продолжительные полные сборки →
ParallelOldGC не подходит
• изменение размера старшего поколения не поможет
• Совет:
• используйте CMS
• исключите полные stop-the-world (STW) сборки (Full GC)
Паузы: Полные сборки
Как бывает
• Происходят только полные сборки
• Причина:
• дисбаланс размеров молодого и старшего поколений
• после полной сборки в старшем поколении нет
свободного места
• Решение:
• ↑ размер старшего поколения
• оптимально ли настроено молодое поколение?
Паузы: выбор GC для старшего
поколения (I)
• Продолжительность и частота малых и полных
сборок устраивает
→ ParallelOldGC
• Продолжительность малых сборок устраивает;
полные сборки слишком продолжительны/часты
→ CMS
• Продолжительность малых сборок недопустима
→ требуется модификация приложения
Паузы: выбор GC для старшего
поколения (II)
• Продолжительность малых сборок может
конфликтовать с требованиями приложения
• Что стоит попробовать:
• уменьшить количество объектов со средней
продолжительностью жизни
• Если возможно, запускать приложение в нескольких JVM с
меньшим размером хипа
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
CMS: Concurrent Mark Sweep
• 3 режима GC
• GC в молодом поколении (Minor GC)
• Полная сборка (Major GC)
• Фоновая сборка (2 коротких STW паузы)
• С остановкой приложения (Full GC)
CMS: как стартовать фоновую сборку
• по пороговому наполнению поколения
• -XX:CMSInitiatingOccupancyFraction=<percent>
• -XX:CMSInitiatingPermOccupancyFraction=<percent>
• System.gc()
• -XX:+ExplicitGCInvokesConcurrent
• -XX:+ExplicitGCInvokesConcurrentAndUnloadClasses
CMS: Фоновая сборка
Как должно быть
Полный цикл фоновой
сборки
Старшее
поколение
Пороговый
уровень
Наполнение
поколения
Приложение
остановлено
работает
во время цикла
%
0
100
CMS: Фоновая сборка
Как должно быть
Полный цикл фоновой
сборки
Старшее
поколение
Initial Mark
Sweep
Remark
Mark
Пороговый
уровень
Наполнение
поколения
Приложение
остановлено
работает
во время цикла
%
0
100
CMS: Сценарии работы
Kак должно быть
• Скорость наполнения старшего поколения
сильно варьируется
• Старшее поколение может заполняться очень быстро
• Частые GC
• Цикл фоновой сборки должен стартовать
заблаговременно
• В старшее поколение попадает мало объектов
• Старшее поколение заполняется медленно и монотонно
• GC редки
• Цикл фоновой сборки безопасно начинать достаточно
поздно
CMS: Сценарии работы
Как бывает (I)
• Цикл начинается слишком рано
• Частые циклы фоновой сборки
• Избыточные накладные расходы
Пороговый
уровень
Наполнение
поколения
Приложение
остановлено
работает
во время цикла
%
0
60
#
1
#
2
CMS: Сценарии работы
Как бывает (II)
• Цикл начинается слишком поздно
• Высока вероятность полной сборки (Full GC)
Пороговый
уровень
Наполнение
поколения
Приложение
остановлено
работает
во время цикла
%
0
100
Full
GC
CMS: Настройка
• Минимизируйте перемещение объектов в старшее
поколение
• Аллокация памяти в старшем поколении дорога (free lists)
• Фрагментация
• -XX:ParallelCMSThreads=<num>
• Количество потоков, участвующих в фоновом GC
• Компромисс между:
• длительностью цикла фоновой сборки
• overhead фоновой сборки
CMS: Фрагментация старшего
поколения
• Неизбежна
• Компактификация только при Full GC
• Можно минимизировать
• Как можно меньше копировать объектов в старшее поколение
• Модифицировать приложение
• Избегайте создания больших объектов разных размеров
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Резюме
<Insert Picture Here>
G1: Описание
• Хип разбит на регионы
• Сборка мусора – эвакуация
регионов
• Основан на поколениях
• Сборка молодого поколения
• Эвакуация всех молодых
регионов
• Сборка старшего поколения
• Эвакуация регионов с
наибольшим количеством
мусора
Регион из молодого поколения
Регион из старшего поколения
Пустой регион
G1: Использование
• -XX:+UseG1GC
• Задаваемые цели на длительность и частоту пауз
• -XX:MaxGCPauseMillis=<num>
• -XX:GCPauseIntervalMillis=<num>
Содержание
• Кратко о сборке мусора
• Мониторинг GC
• Настройка GC
• Объем используемой памяти
• Молодое поколение
• Паузы
• CMS
• G1
• Выводы
<Insert Picture Here>
Подводим итоги
• Объем используемой памяти
• Конфигурация хипа
• Длительность пауз
• Конфигурация молодого поколения
• Контроль времени жизни объектов
• Выбор сборщика для старшего поколения
• ParallelOldGC
• CMS
• Настройка фонового режим
• G1
Необычные конфигурации
• Размер молодого поколения = 80% хипа
• Размер старшего поколение = 1.2x от размера
долгоживущих живых объектов
• Начало фоновой сборки при 95% занятости
старшего поколения
Measure, don't guess!
“If you aren't assessing, you're guessing.”
- Fitness Industry
Q & A
QUESTIONS
ANSWERS&
© 2008 Oracle Corporation – Proprietary and Confidential
© 2008 Oracle Corporation – Proprietary and Confidential

More Related Content

What's hot

Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Ontico
 
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBSergey Petrunya
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ontico
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 

What's hot (8)

Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...
 
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 

Similar to "Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)

Where is the space, Postgres?
Where is the space, Postgres?Where is the space, Postgres?
Where is the space, Postgres?Alexey Ermakov
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with JavaAndrei Pangin
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноVitebsk DSC
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)Ontico
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MageCloud
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NETAndrey Akinshin
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Ontico
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Ontico
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicVadim Tsesko
 
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)Ontico
 
maps.sputnik.ru #highload2014
maps.sputnik.ru #highload2014maps.sputnik.ru #highload2014
maps.sputnik.ru #highload2014Maxim Dementyev
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про памятьAndrey Akinshin
 
Boost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуBoost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуcorehard_by
 
Вячеслав Бирюков - Как Linux работает с памятью
Вячеслав Бирюков - Как Linux работает с памятьюВячеслав Бирюков - Как Linux работает с памятью
Вячеслав Бирюков - Как Linux работает с памятьюYandex
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptFDConf
 

Similar to "Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011) (20)

Where is the space, Postgres?
Where is the space, Postgres?Where is the space, Postgres?
Where is the space, Postgres?
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильно
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)
 
G1
G1G1
G1
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
Как обслужить 60 миллионов абонентов, Артем Руфанов (ПЕТЕР-СЕРВИС)
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)
Архитектура бэкенда карт Sputnik.ru, Максим Дементьев (Спутник)
 
maps.sputnik.ru #highload2014
maps.sputnik.ru #highload2014maps.sputnik.ru #highload2014
maps.sputnik.ru #highload2014
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про память
 
Boost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почемуBoost.Algorithm: что, зачем и почему
Boost.Algorithm: что, зачем и почему
 
Вячеслав Бирюков - Как Linux работает с памятью
Вячеслав Бирюков - Как Linux работает с памятьюВячеслав Бирюков - Как Linux работает с памятью
Вячеслав Бирюков - Как Linux работает с памятью
 
Построение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascriptПостроение мультисервисного стартапа в реалиях full-stack javascript
Построение мультисервисного стартапа в реалиях full-stack javascript
 
Build your own multistack JS startup
Build your own multistack JS startupBuild your own multistack JS startup
Build your own multistack JS startup
 

More from Vladimir Ivanov

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia Vladimir Ivanov
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...Vladimir Ivanov
 
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine Vladimir Ivanov
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, UkraineVladimir Ivanov
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013Vladimir Ivanov
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013Vladimir Ivanov
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012Vladimir Ivanov
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: FootprintVladimir Ivanov
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMVladimir Ivanov
 
G1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorG1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorVladimir Ivanov
 

More from Vladimir Ivanov (10)

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
 
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: Footprint
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVM
 
G1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorG1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage Collector
 

"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)

  • 1. © 2008 Oracle Corporation – Proprietary and Confidential
  • 2. <Insert Picture Here> Диагностирование проблем и настройка GC в HotSpot JVM Владимир Иванов Oracle Corporation Vladimir.x.Ivanov@oracle.com 21.05.2011
  • 3. The First Rule of Program Optimization: Don't do it. –Michael A. Jackson (not the singer!)
  • 4. The Second Rule of Program Optimization (for experts only!): Don't do it yet. –Michael A. Jackson
  • 5. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 6. Сборка мусора (GC) • Находит и освобождает место, занимаемое ненужными объектами • Объекты вне транзитивного замыкания, включающего roots (стеки потоков, статические поля классов и т.д.) • Автоматическая и безопасная • Проще, если граф объектов “заморожен” • Stop-the-world (STW) паузы • Возможны различные подходы • c дефрагментацией или без • Алгоритмы: copying, mark-sweep, mark-compact, ... • Аллокация: linear, free lists, ...
  • 7. Сборка мусора с поколениями (I) • Слабая гипотеза о поколениях • Большинство объектов временные • Старые объекты редко ссылаются на молодые • Молодые и старые объекты содержатся отдельно • В пространствах называемых “поколения” (generations) • Возможны разные алгоритмы для молодого и старого поколения • Mолодое поколение можно собирать отдельно от старого
  • 8. Сборка мусора с поколениями (II) Молодое поколение Старшее поколение Продвижение объектов Аллокация объектов Необходимо отслеживать ссылки
  • 9. GC в Hotspot • SerialGC • последовательная сборка молодого и старого поколений • ParallelGC • максимальный throughput • параллельная сборка молодого и старого поколений • CMS • предсказуемость • по возможности, сборка мусора в фоновом режиме • G1 • предсказуемость • слабо подвержен фрагментации • прямой конкурент CMS
  • 10. GC в Hotspot: о чем будем говорить • SerialGC • последовательная сборка молодого и старого поколений • ParallelGC • максимальный throughput • параллельная сборка молодого и старого поколений • CMS • предсказуемость • по возможности, сборка мусора в фоновом режиме • G1 • предсказуемость • слабо подвержен фрагментации • прямой конкурент CMS
  • 11. ParallelGC: описание • Молодое поколение: параллельный копирующий GC • Старшее поколение: параллельный Mark-Compact GC • Аллокация: линейная • -XX:+UseParallelGC -XX:+UseParallelOldGC
  • 12. Concurrent Mark Sweep: описание • Молодое поколение: параллельный копирующий GC • Старшее поколение: фоновый Mark-Sweep GC • Аллокация: free-листы • Компактификация только при Full GC • -XX:+UseConcMarkSweep
  • 13. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 14. Диагностический вывод GC • Параметры VM • -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:<file> • -XX:+PrintGCDateStamps • -XX:+PrintHeapAtGC • Минимальные накладные расходы • Анализ диагностического вывода GC • PrintGCStats • GChisto: http://gchisto.dev.java.net/
  • 16. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 17. Идеальный сборщик мусора • Не прерывает работу приложения • Использует ровно столько оперативной памяти, сколько нужно приложению • Не требует дополнительных вычислительных ресурсов
  • 18. Производительность GC • 3 характеристики • Throughput • Объем вычислительных ресурсов, затрачиваемых на GC • Предсказуемость • На какое время прерывается работа приложения • Footprint • Объем используемой памяти
  • 19. Принципы настройки GC • Чем больше доступно памяти GC, тем лучше • Оптимизировать по 2 параметрам из 3 • Throughput • Длительность пауз • Объем используемой памяти
  • 20. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 21. Критерии выбора размера хипа • Чем больше памяти, тем лучше для GC • Как для молодого, так и для старшего поколения • Более редкие сборки • Ниже затраты на сборку мусора • Доступный объем памяти ограничен • Физическая память • 32-битный режим • Наличие других приложений в системе
  • 22. Размеры поколений • Размер молодого поколения • Определяет частоту малых сборок (Minor GC) • Влияет на то, сколько объектов умирает, не покидая молодое поколении • Размер старшего поколения • Определяет частоту полных сборок (Full GC) • Не меньше суммарного размера долгоживущих объектов, используемых приложением в стабильном состоянии
  • 23. Управление размерами поколений Survivor Tenured PermGen -XX:MaxNewSize Survivor Eden -XX:PermSize-XX:NewSize -XX:MaxPermSize -Xms -Xmx Молодое поколение (Young Gen) Старшее поколение (Old Gen) Permanent Generation (Perm Gen)
  • 24. Размер хипа: основные цели • Объем используемой памяти не должен превышать объем физической памяти • Максимизировать объем памяти, освобождаемый при малых и полных GC • Относится ко всем GC
  • 25. Размер хипа: с чего лучше начать? • LDS = Live Data Size • размер множества достижимых объектов • для приложение в стабильном состоянии • -Xms / -Xmx = 3-4x LDS • -XX:PermSize = 1.2-1.5x от макс. размера PermGen • Размеры поколений • Молодое поколение: -Xmn = 1-1.5x LDS • Старшее поколение: -Xmx = 2-3x LDS + -Xmn • Пример: Если LDS == 512m, тогда -Xmn768m -Xms2g -Xmx2g
  • 26. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 30. Перемещение в старшее поколение • Временные объекты должны умирать в молодом поколении • Долгоживущие объекты должны попадать в старшее поколение как можно раньше
  • 32. Живыеобъекты (размер) Возраст (кол-во GC) 1 2 3 4 5 Регион Eden (Young Gen) Регион Survivor (Young Gen) Старшее поколение (Old / Tenured Gen) Время жизни объектов: Как должно быть
  • 33. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total
  • 34. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Возраст (age) – количество пережитых малых GC
  • 35. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Суммарный размер объектов определенного возраста
  • 36. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Суммарный размер объектов, не старше определенного возраста
  • 37. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Общий размер объектов в Survivor пространстве
  • 38. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Эффективный размер Survivor пространства • == (Размер Survivor) x TargetSurvivorRatio • -XX:TargetSurvivorRatio=<percent> ([1..100])
  • 39. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Текущий пороговый возраст копирования в старшее поколение
  • 40. Время жизни объектов • -XX:+PrintTenuringDistribution Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total • Максимальный пороговый возраст копирования • -XX:MaxTenuringThreshold (MTT)
  • 41. Время жизни объектов: Как должно быть Desired survivor size 6684672 bytes, new threshold 8 (max 8) - age 1: 2315488 bytes, 2315488 total - age 2: 19528 bytes, 2335016 total - age 3: 96 bytes, 2335112 total - age 4: 32 bytes, 2335144 total
  • 42. Время жизни объектов: Как бывает (I) Desired survivor size 3342336 bytes, new threshold 1 (max 6) - age 1: 3956928 bytes, 3956928 total
  • 43. Время жизни объектов: Как бывает (I) Вывод: размер Survivor слишком мал. Решение: увеличить размер Survivor и/или Eden. • -XX:MaxNewSize / -Xmn • -XX:SurvivorRatio=<ratio> соотношение между Eden и Survivor Desired survivor size 3342336 bytes, new threshold 1 (max 6) - age 1: 3956928 bytes, 3956928 total
  • 44. Время жизни объектов: Как бывает (II) Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total
  • 45. Время жизни объектов: Как бывает (II) Вывод: настройки не оптимальны. Решение: 2 варианта: • Увеличить MTT: 6 → [7...] • Установить MTT = 2 Desired survivor size 3342336 bytes, new threshold 6 (max 6) - age 1: 2483440 bytes, 2483440 total - age 2: 501240 bytes, 2984680 total - age 3: 50016 bytes, 3034696 total - age 4: 49088 bytes, 3083784 total - age 5: 48616 bytes, 3132400 total - age 6: 50128 bytes, 3182528 total
  • 46. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 47. Паузы: Молодое поколение • Продолжительность малых сборок • Часто является причиной задержек, вызванных GC • Важна как продолжительность, так и частота • Малые сборки продолжительны → ↓ размер молодого поколения часты → ↑ размер молодого поколения
  • 48. Паузы: Старшее поколение (I) • ParallelOldGC vs CMS • ParallelOldGC может удовлетворять достаточно жестким ограничениям на длительность пауз • NB! прежде чем использовать CMS убедитесь, что ParallelOldGC не подходит
  • 49. Паузы: Старшее поколение (II) • -XX:+UseParallelOldGC • -XX:ParallelGCThreads=<num>
  • 50. Паузы: Старшее поколение (III) • Частые полные сборки → ↑ размер старшего поколения • постарайтесь зафиксировать размер молодого поколения • Продолжительные полные сборки → ParallelOldGC не подходит • изменение размера старшего поколения не поможет • Совет: • используйте CMS • исключите полные stop-the-world (STW) сборки (Full GC)
  • 51. Паузы: Полные сборки Как бывает • Происходят только полные сборки • Причина: • дисбаланс размеров молодого и старшего поколений • после полной сборки в старшем поколении нет свободного места • Решение: • ↑ размер старшего поколения • оптимально ли настроено молодое поколение?
  • 52. Паузы: выбор GC для старшего поколения (I) • Продолжительность и частота малых и полных сборок устраивает → ParallelOldGC • Продолжительность малых сборок устраивает; полные сборки слишком продолжительны/часты → CMS • Продолжительность малых сборок недопустима → требуется модификация приложения
  • 53. Паузы: выбор GC для старшего поколения (II) • Продолжительность малых сборок может конфликтовать с требованиями приложения • Что стоит попробовать: • уменьшить количество объектов со средней продолжительностью жизни • Если возможно, запускать приложение в нескольких JVM с меньшим размером хипа
  • 54. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 55. CMS: Concurrent Mark Sweep • 3 режима GC • GC в молодом поколении (Minor GC) • Полная сборка (Major GC) • Фоновая сборка (2 коротких STW паузы) • С остановкой приложения (Full GC)
  • 56. CMS: как стартовать фоновую сборку • по пороговому наполнению поколения • -XX:CMSInitiatingOccupancyFraction=<percent> • -XX:CMSInitiatingPermOccupancyFraction=<percent> • System.gc() • -XX:+ExplicitGCInvokesConcurrent • -XX:+ExplicitGCInvokesConcurrentAndUnloadClasses
  • 57. CMS: Фоновая сборка Как должно быть Полный цикл фоновой сборки Старшее поколение Пороговый уровень Наполнение поколения Приложение остановлено работает во время цикла % 0 100
  • 58. CMS: Фоновая сборка Как должно быть Полный цикл фоновой сборки Старшее поколение Initial Mark Sweep Remark Mark Пороговый уровень Наполнение поколения Приложение остановлено работает во время цикла % 0 100
  • 59. CMS: Сценарии работы Kак должно быть • Скорость наполнения старшего поколения сильно варьируется • Старшее поколение может заполняться очень быстро • Частые GC • Цикл фоновой сборки должен стартовать заблаговременно • В старшее поколение попадает мало объектов • Старшее поколение заполняется медленно и монотонно • GC редки • Цикл фоновой сборки безопасно начинать достаточно поздно
  • 60. CMS: Сценарии работы Как бывает (I) • Цикл начинается слишком рано • Частые циклы фоновой сборки • Избыточные накладные расходы Пороговый уровень Наполнение поколения Приложение остановлено работает во время цикла % 0 60 # 1 # 2
  • 61. CMS: Сценарии работы Как бывает (II) • Цикл начинается слишком поздно • Высока вероятность полной сборки (Full GC) Пороговый уровень Наполнение поколения Приложение остановлено работает во время цикла % 0 100 Full GC
  • 62. CMS: Настройка • Минимизируйте перемещение объектов в старшее поколение • Аллокация памяти в старшем поколении дорога (free lists) • Фрагментация • -XX:ParallelCMSThreads=<num> • Количество потоков, участвующих в фоновом GC • Компромисс между: • длительностью цикла фоновой сборки • overhead фоновой сборки
  • 63. CMS: Фрагментация старшего поколения • Неизбежна • Компактификация только при Full GC • Можно минимизировать • Как можно меньше копировать объектов в старшее поколение • Модифицировать приложение • Избегайте создания больших объектов разных размеров
  • 64. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Резюме <Insert Picture Here>
  • 65. G1: Описание • Хип разбит на регионы • Сборка мусора – эвакуация регионов • Основан на поколениях • Сборка молодого поколения • Эвакуация всех молодых регионов • Сборка старшего поколения • Эвакуация регионов с наибольшим количеством мусора Регион из молодого поколения Регион из старшего поколения Пустой регион
  • 66. G1: Использование • -XX:+UseG1GC • Задаваемые цели на длительность и частоту пауз • -XX:MaxGCPauseMillis=<num> • -XX:GCPauseIntervalMillis=<num>
  • 67. Содержание • Кратко о сборке мусора • Мониторинг GC • Настройка GC • Объем используемой памяти • Молодое поколение • Паузы • CMS • G1 • Выводы <Insert Picture Here>
  • 68. Подводим итоги • Объем используемой памяти • Конфигурация хипа • Длительность пауз • Конфигурация молодого поколения • Контроль времени жизни объектов • Выбор сборщика для старшего поколения • ParallelOldGC • CMS • Настройка фонового режим • G1
  • 69. Необычные конфигурации • Размер молодого поколения = 80% хипа • Размер старшего поколение = 1.2x от размера долгоживущих живых объектов • Начало фоновой сборки при 95% занятости старшего поколения
  • 70. Measure, don't guess! “If you aren't assessing, you're guessing.” - Fitness Industry
  • 72. © 2008 Oracle Corporation – Proprietary and Confidential
  • 73. © 2008 Oracle Corporation – Proprietary and Confidential