SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
1
Леонид Месник
Sun Microsystems
G1: Следующее поколение
сборщика мусора
для HotSpot VM
1
2
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
3
Сборка мусора в JVM
• Прозрачна для приложения
> Только new()
• Влияние на работу приложения
> Производительность
> Предсказуемость
> Потребление памяти
4
Предсказуемость
Возможность системы реагировать на запросы за
определенные промежутки времени
• В каких Java приложениях нужна
предсказуемость?
> Торговые площадки
> Колл-центры
> Интерактивные системы
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
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
7
Основные понятия
• Stop The World (STW) пауза
> Режим VM, требующий полной остановки приложения
• Roots (Активные объекты)
> Изначально достижимые объекты
– Стеки, глобальные переменные, и т.д.
• Parallel GC/Параллельная сборка
> В нескольких потоках одновременно, в режиме паузы
• Concurrent GC/Фоновая сборка
> Одновременно с приложением в другом потоке
8
Цветовые обозначения
Живые (достижимые) объекты
Мертвые (недостижимые) объекты
Неиспользуемая (неактивная) область памяти
Roots (Изначально достижимые объекты)
Используемая (активная) область памяти
9
Stop & Copy
• Copy
> Живые объекты копируются в неактивную область
памяти
> Неактивная область становится активной (и наоборот)
• Требует дополнительной памяти
• Время зависит от живых объектов
• Быстрая аллокация
> “Сдвиг указателя”
10
Mark & Sweep
• Mark
> Помечаются все живые объекты
• Sweep
> Помечается неиспользуемое место
• Возможен в фоновом режиме
> Очень низкая скорость сборки
• Фрагментация памяти
• Медленная аллокация
> Списки свободной памяти
V VV
X X
11
Mark Sweep Compact
• Mark
> Помечаются живые объекты
• Sweep
> Помечаются мертвые объекты
• Compact
> Живые объекты переносятся в
свободную область
• Быстрая аллокация памяти
> “Сдвиг указателя”
• Низкая скорость сборки
V VV
X X
12
Слабая гипотеза о поколениях
• Основана на 2 наблюдениях
> Большинство объектов умирают молодыми
> Мало ссылок из старых объектов на молодые
• Вся память разбита на поколения
> Обычно 2 поколения – молодое и старшее
> Молодое поколение собирается отдельно
> Пережившие несколько сборок объекты переходят
из молодого поколения в старшее
• Используется всеми сборщиками в HotSpot VM
13
Что такое Full GC?
roots Heap
Молодое поколение
Stop & Copy
быстро
часто
Старшее поколение
Mark Sweep Compact
медленно
редко
Full GC:
сборка старшего поколения
14
Сборщики мусора в HotSpot JVM
• Производительные
> -XX:+UseParallelGC, -XX:+UseParallelOldGC, ...
> Редкие полные сборки (Full GC) не ухудшают
общую производительность
• Предсказуемый
> -XX:+UseConcMarkSweep (CMS)
> В старшем поколении используется
Mark & Sweep в фоновом режиме
– Фрагментация
– Низкая производительность
– Возможна полная сборка мусора (Full GC)
15
Проблема Full GC
• Требуется во всех сборщиках HotSpot VM
• Требует остановки приложения
• Длительная операция
> Используется вся память
> Скорость доступа к памяти ограниченна
• Основной источник пауз в HotSpot VM
Необходим новый сборщик мусора, позволяющий
избежать полной сборки
16
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
17
Как работает G1?
• Вся память разбита на регионы
> Размер региона по умолчанию – 1MB
> “Большие” объекты (>500KB) используют
смежные регионы целиком
• Сборка мусора производится
эвакуацией регионов
> Живые объекты копируются в другие
регионы
> Освобожденные регионы используются для
повторного выделения объектов
18
Эвакуация региона
• Используется алгоритм копирования
> Копирование живых объектов
> Обновление соответствующих ссылок
• Информация о внешних ссылках на объекты внутри
региона – Remembered Set
> Позволяет при обновлении ссылок не исследовать
всю память
Эвакуация объектов из 2 регионов в 1 новый
Remembered
Sets
19
G1: Сборка мусора
Старшее
поколение
Неиспользуемая память
• Основан на поколениях
> Поколения - множества регионов
• Сборка молодого поколения
> Эвакуация всех молодых регионов
• Сборка старшего поколения
> Эвакуация наименнее занятых
регионов
Молодое
поколение
Новые регионы в молодом
поколении
Новые регионы в старшем
поколении
20
Сборка молодого поколения
• При сборке происходит
эвакуация всех регионов
• Используется Stop & Copy
> Быстрое выделение памяти
“сдвиг указателя”
• Размер молодого поколения
легко менять “на лету”
21
Сборка молодого поколения
• При эвакуации объекты
копируются:
> Пережившие несколько сборок –
в старшее поколение
> Остальные - в молодое
поколение
22
Сборка старшего поколения
• Помечаются все живые объекты
> Фаза Mark из Mark & Sweep
> В фоновом режиме
• Подсчитывается количество живых
объектов в регионах
• Освобождаются регионы без живых
объектов
• Выбираются объекты для эвакуации
> Содержащие наименьшее
количество живых объектов
23
Сборка старшего поколения
• Одновременно с последующей
сборкой молодого поколения
> Эвакуируются наименее занятые
регионы
> Объекты копируются в старшее
поколение
24
Сборка старшего поколения
• Постоянная сборка в старшем
поколении
> Отсутствие фрагментации
• Полная сборка не требуется
> Возможна при нехватке ресурсов
Основная идея Garbage First :
“Мусор в первую очередь”
25
Предсказуемость в G1
• Задаваемые желаемые паузы
> Высокая вероятность, но не 100%
• Отсутствие фрагментации
> Важно для серверных приложений
• Автоматическая настройка
> Размеры очищаемой памяти в зависимости
от желаемой паузы
26
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
27
Использование G1
• java -XX:+UseG1GC
> -Xmx2G
> -XX:MaxGCPauseMillis=200
> -XX:GCPauseIntervalMillis=500
> -XX:+DisableExplicitGC
> -XX:ParallelGCThreads=4
> -XX:ConcGCThreads=4
> -XX:G1HeapRegionSize=1M
GOAL
28
7.930: [GC pause (young) 3649M->3658M(6144M), 0.19404389 secs]
8.770: [GC concurrent-mark-start]
9.070: [GC concurrent-mark-end, 0.2046616 sec]
9.070: [GC remark, 0.0014442 secs]
9.072: [GC concurrent-count-start]
9.084: [GC pause (young) 4246M->4257M(6144M), 0.1878431 secs]
10.102: [GC concurrent-count-end, 1.0302946]
11.189: [GC pause (partial) 4711M->4179M(6144M), 0.1352000 secs]
...
25.986:[Full GC 6119M->5916M(6144M), 4.7193864 secs]
7.930: [GC pause (young) 3649M->3658M(6144M), 0.19404389 secs]
8.770: [GC concurrent-mark-start]
9.070: [GC concurrent-mark-end, 0.2046616 sec]
9.070: [GC remark, 0.0014442 secs]
9.072: [GC concurrent-count-start]
9.084: [GC pause (young) 4246M->4257M(6144M), 0.1878431 secs]
10.102: [GC concurrent-count-end, 1.0302946]
11.189: [GC pause (partial) 4711M->4179M(6144M), 0.1352000 secs]
...
25.986:[Full GC 6119M->5916M(6144M), 4.7193864 secs]
Использование G1
java -XX:+UseG1GC -XX:+PrintGC -XX:+PrintGCTimeStamps
Паузы
Full GC
Фоновые
29
Возможные причины Full GC
• Недостаток ресурсов
> Добавьте больше памяти или проц. времени
• Сборка классов
> Следите за загрузкой/выгрузкой классов
• Большие объекты
> Старайтесь не создавать объекты более 500К
• Явный вызов System.gc()
> -XX:+DisableExplicitGC
30
Содержание
• Сборка мусора в JVM
> Влияние на работу приложения
> Основные подходы и проблемы
• G1
> Описание алгоритма
> Использование
• Итоги
31
Сборщик G1 в HotSpot JVM
• Желаемые временные ограничения
• Простая настройка
• Приемлемая производительность
• Масштабируемость
• Подходит для серверных приложений с
ограниченным временем реакции
• Замена ConcurrentMarkSweep (CMS)
32
G1 и Real Time
• G1 != Real Time
> Небходима OC реального времени
> Планировщик потоков
> И многое другое ...
• Используйте Java Real-Time System
> Real Time GC (RTGC)
33
G1 среди остальных сборщиков
Скорость
Предсказуемость
G1
CMS
RTGC
Parallel GC
G1 – замена CMS
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/
35
Леонид Месник
Leonid.Mesnik@sun.com
35
Вопросы и ответы

Contenu connexe

En vedette

Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boleta
Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boletaNit 38919370-per-2014-12-cod-2237-nro-13796839254-boleta
Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boletaCarlos Rene Lopez Caneck
 
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010jorge
 
Data. Insight. Action. Infographics. Where are companies going wrong with dat...
Data. Insight. Action. Infographics. Where are companies going wrong with dat...Data. Insight. Action. Infographics. Where are companies going wrong with dat...
Data. Insight. Action. Infographics. Where are companies going wrong with dat...Conduit2Loyalty
 
Agriculture Materiality Report
Agriculture Materiality ReportAgriculture Materiality Report
Agriculture Materiality ReportRyan Wampler
 
NFIP Dissertation Defense
NFIP Dissertation DefenseNFIP Dissertation Defense
NFIP Dissertation DefenseJames Howard
 
Critérios apropampa - Carlos Nabinger
Critérios apropampa - Carlos NabingerCritérios apropampa - Carlos Nabinger
Critérios apropampa - Carlos Nabingeragencialarue
 
Un Paseo por las Transformaciones AST de Groovy
Un Paseo por las Transformaciones AST de GroovyUn Paseo por las Transformaciones AST de Groovy
Un Paseo por las Transformaciones AST de GroovyAndres Almiray
 
5 education ethical code
5 education ethical code5 education ethical code
5 education ethical codeJessAnn22988
 
Bifequali apropampa (27/05/2011)
Bifequali apropampa (27/05/2011)Bifequali apropampa (27/05/2011)
Bifequali apropampa (27/05/2011)agencialarue
 

En vedette (13)

Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boleta
Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boletaNit 38919370-per-2014-12-cod-2237-nro-13796839254-boleta
Nit 38919370-per-2014-12-cod-2237-nro-13796839254-boleta
 
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010
U2 Meta2 2a2 Stl Invest P Diagnost 28feb2010
 
Surendra Pratap CV
Surendra Pratap CVSurendra Pratap CV
Surendra Pratap CV
 
Sansnom1 160131212816
Sansnom1 160131212816Sansnom1 160131212816
Sansnom1 160131212816
 
Data. Insight. Action. Infographics. Where are companies going wrong with dat...
Data. Insight. Action. Infographics. Where are companies going wrong with dat...Data. Insight. Action. Infographics. Where are companies going wrong with dat...
Data. Insight. Action. Infographics. Where are companies going wrong with dat...
 
Agriculture Materiality Report
Agriculture Materiality ReportAgriculture Materiality Report
Agriculture Materiality Report
 
NFIP Dissertation Defense
NFIP Dissertation DefenseNFIP Dissertation Defense
NFIP Dissertation Defense
 
Critérios apropampa - Carlos Nabinger
Critérios apropampa - Carlos NabingerCritérios apropampa - Carlos Nabinger
Critérios apropampa - Carlos Nabinger
 
Un Paseo por las Transformaciones AST de Groovy
Un Paseo por las Transformaciones AST de GroovyUn Paseo por las Transformaciones AST de Groovy
Un Paseo por las Transformaciones AST de Groovy
 
Television
TelevisionTelevision
Television
 
5 education ethical code
5 education ethical code5 education ethical code
5 education ethical code
 
Bifequali apropampa (27/05/2011)
Bifequali apropampa (27/05/2011)Bifequali apropampa (27/05/2011)
Bifequali apropampa (27/05/2011)
 
Sintesis Del Islam
Sintesis Del IslamSintesis Del Islam
Sintesis Del Islam
 

Similaire à G1

Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NETAndrey Akinshin
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноVitebsk DSC
 
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл Голоднов
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл ГолодновОб одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл Голоднов
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл ГолодновYandex
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Погружение в виртуальную память и большие страницы / Константин Новаковский (...Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Погружение в виртуальную память и большие страницы / Константин Новаковский (...Ontico
 
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...QAFest
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Ontico
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptMikhail Davydov
 
Deployment to production with an unexpected load
Deployment to production with an unexpected loadDeployment to production with an unexpected load
Deployment to production with an unexpected loadGrid Dynamics
 
Контейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемКонтейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемYandex
 
Контейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемКонтейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемOpenVZ
 
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...Айдар Гилязов
 
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014CleverDATA
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
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
 
Call of Postgres: Advanced Operations (part 2)
Call of Postgres: Advanced Operations (part 2)Call of Postgres: Advanced Operations (part 2)
Call of Postgres: Advanced Operations (part 2)Alexey Lesovsky
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicVadim Tsesko
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Ontico
 

Similaire à G1 (20)

Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
 
Оптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильноОптимизация потребления памяти в Java - делаем уборку правильно
Оптимизация потребления памяти в Java - делаем уборку правильно
 
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл Голоднов
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл ГолодновОб одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл Голоднов
Об одной неприятной проблеме сборщика Concurrent Mark-Sweep, Кирилл Голоднов
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Погружение в виртуальную память и большие страницы / Константин Новаковский (...Погружение в виртуальную память и большие страницы / Константин Новаковский (...
Погружение в виртуальную память и большие страницы / Константин Новаковский (...
 
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...
QA Fest 2018. Святослав Логин. Что такое Metasploit? Как его использовать для...
 
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
Оптимизация UI потока / Дмитрий Куркин (Mail.Ru)
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
 
Deployment to production with an unexpected load
Deployment to production with an unexpected loadDeployment to production with an unexpected load
Deployment to production with an unexpected load
 
Контейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемКонтейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблем
 
Контейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблемКонтейнеры в OpenStack: простое решение сложных проблем
Контейнеры в OpenStack: простое решение сложных проблем
 
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...
Опыт построения комплексного катастрофоустойчивого решения NetApp и фрагмента...
 
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
Реклама со скоростью света. Презентация Сергея Жемжицкого на High Load++ 2014
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
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"
 
Call of Postgres: Advanced Operations (part 2)
Call of Postgres: Advanced Operations (part 2)Call of Postgres: Advanced Operations (part 2)
Call of Postgres: Advanced Operations (part 2)
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
linux and freebsd monitoring
linux and freebsd monitoringlinux and freebsd monitoring
linux and freebsd monitoring
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
 

G1

  • 1. 1 Леонид Месник Sun Microsystems G1: Следующее поколение сборщика мусора для HotSpot VM 1
  • 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 > Описание алгоритма > Использование • Итоги
  • 27. 27 Использование G1 • java -XX:+UseG1GC > -Xmx2G > -XX:MaxGCPauseMillis=200 > -XX:GCPauseIntervalMillis=500 > -XX:+DisableExplicitGC > -XX:ParallelGCThreads=4 > -XX:ConcGCThreads=4 > -XX:G1HeapRegionSize=1M GOAL
  • 28. 28 7.930: [GC pause (young) 3649M->3658M(6144M), 0.19404389 secs] 8.770: [GC concurrent-mark-start] 9.070: [GC concurrent-mark-end, 0.2046616 sec] 9.070: [GC remark, 0.0014442 secs] 9.072: [GC concurrent-count-start] 9.084: [GC pause (young) 4246M->4257M(6144M), 0.1878431 secs] 10.102: [GC concurrent-count-end, 1.0302946] 11.189: [GC pause (partial) 4711M->4179M(6144M), 0.1352000 secs] ... 25.986:[Full GC 6119M->5916M(6144M), 4.7193864 secs] 7.930: [GC pause (young) 3649M->3658M(6144M), 0.19404389 secs] 8.770: [GC concurrent-mark-start] 9.070: [GC concurrent-mark-end, 0.2046616 sec] 9.070: [GC remark, 0.0014442 secs] 9.072: [GC concurrent-count-start] 9.084: [GC pause (young) 4246M->4257M(6144M), 0.1878431 secs] 10.102: [GC concurrent-count-end, 1.0302946] 11.189: [GC pause (partial) 4711M->4179M(6144M), 0.1352000 secs] ... 25.986:[Full GC 6119M->5916M(6144M), 4.7193864 secs] Использование G1 java -XX:+UseG1GC -XX:+PrintGC -XX:+PrintGCTimeStamps Паузы Full GC Фоновые
  • 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/