SlideShare a Scribd company logo
Garbage collection
in V8 VM
1
Кто я такой?
2
Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
2
Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
2
Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
• Люблю копаться в движках и писать фронтенд.
2
Кто я такой?
• Студент факультета кибернетики КНУ им.
Шевченка.
• Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8).
• Люблю копаться в движках и писать фронтенд.
• Компиляторов, если что.
2
Вся мудрость тут
Вся мудрость тут
Все основные
алгоритмы GC
пользуют наработки
этой книги
GC в V8
5
GC в V8
• Как и во всех виртуальных машинах,
существует система управления
памятью :
5
GC в V8
• Как и во всех виртуальных машинах,
существует система управления
памятью :
• Аллокатор.
5
GC в V8
• Как и во всех виртуальных машинах,
существует система управления
памятью :
• Аллокатор.
• Сборщик мусора (он же GC).
5
Модель памяти в JS (V8)
6
Модель памяти в JS (V8)
6
• Отдельно представлены целые числа на
стеке
Модель памяти в JS (V8)
6
• Все остальные объекты, аллоцирующиеся в
хипе, неявно наследуются от HeapObject.

• Все объекты выровнены на 4 байта.
• Отдельно представлены целые числа на
стеке
Как устроен Heap
7
Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
7
Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
• Old Space (aka OldGen) : Объекты, пережившие
одну и больше фаз сборки.
7
Как устроен Heap
• New Space (aka YoungGen): Большинство
объектов живут именно здесь. Умирают тоже.
• Old Space (aka OldGen) : Объекты, пережившие
одну и больше фаз сборки.
• Code Space: Здесь размещаются объекты кода,
содержащие инструкции JIT-компилятора. Это
единственное пространство с исполняемой
памятью.
7
Слабая гипотеза о поколениях
8
Слабая гипотеза о поколениях
• Объекты чаще всего не переживают
следующей сборки после их рождения.
8
Слабая гипотеза о поколениях
• Объекты чаще всего не переживают
следующей сборки после их рождения.
• Объекты чаще всего умирают
молодыми.
8
Внезапная польза
10
Внезапная польза
• Подобная гипотеза, подтвержденная частыми
наблюдениями (не только в V8), позволяет
разработчикам виртуальных машин делать
некоторые спекулятивные операции.
10
Внезапная польза
• Подобная гипотеза, подтвержденная частыми
наблюдениями (не только в V8), позволяет
разработчикам виртуальных машин делать
некоторые спекулятивные операции.
• А именно - разделять сборки в регионах хипа, и
разрабатывать разные алгоритмы для них.
10
Подходы к сборке
11
Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
11
Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
• Concurrent (сборщик (частями) работает
параллельно с приложением).
11
Подходы к сборке
• Stop-the-world (город main-thread приложения
засыпает, GC работает, после окончания
приложение опять просыпается).
• Concurrent (сборщик (частями) работает
параллельно с приложением).
• Важно : конкурентными могут быть несколько
из фаз сборки!
11
Стратегии сборки
12
Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
12
Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
12
Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
• Mark-Sweep/Compact: помечаем все живые объекты,
удаляем недостижимые (и делаем перемещение
живых регионов).
12
Стратегии сборки
Всего существует аж 3 стратегии сборки мусора :
• No operations: считаем все объекты мусором, и
творим тотальный экстерминатус всем обитателям
хипа, вырубая работающую VM.
• Mark-Sweep/Compact: помечаем все живые объекты,
удаляем недостижимые (и делаем перемещение
живых регионов).
• Pointer counting: присобачиваем к каждому объекту
счетчик ссылок на него и удаляем его, когда счетчик
равен нулю.
12
Немного недоумения
13
Немного недоумения
• Вообще-то, настоящим, на мой вкус, сборщиком
мусора, является подход с подсчетом ссылок.
13
Немного недоумения
• Вообще-то, настоящим, на мой вкус, сборщиком
мусора, является подход с подсчетом ссылок.
• В Mark-* мы помечаем и перемещаем
достижимые объекты, а не мусор!
13
Сборка в YoungGen
14
Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
14
Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
14
Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
• К GC прилетел сигнал, что в «To Space»
переполнение.
14
Сборка в YoungGen
• Два субрегиона : «From Space» и «To Space»
• «From Space» изначально пустой.
• К GC прилетел сигнал, что в «To Space»
переполнение.
• Также существует специальный Pointer Map на
все объекты из Young Generation.
14
Scavenger, Part 1
15
Scavenger, Part 1
15
Scavenger, Part 1
1. To Space переполнился*,
GC начинает работу.
15
Scavenger, Part 1
1. To Space переполнился*,
GC начинает работу.
2. To Space и From Space
обмениваются своим
содержимым.
15
Scavenger, Part 2
16
Scavenger, Part 2
16
Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
16
Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
4. Перемещаем живые
объекты в To Space,
удаляем лишнее из From
Space.
16
Scavenger, Part 2
3. Проходимся линейно по
From Space, помечаем
живые объекты.
4. Перемещаем живые
объекты в To Space,
удаляем лишнее из From
Space.
5. To Space отдает эти
данные в OldGen.
16
Сборка в OldGen
17
Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
17
Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
17
Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
2. Чистим хип. (Sweep)
17
Сборка в OldGen
Сборка в OldGen является классическим
алгоритмом Mark-Compact:
1. Сначала, начиная из rootset, проходимся по
всему графу объектов и помечаем
достижимые. (Mark*)
2. Чистим хип. (Sweep)
3. Сжимаем хип. (Compact)
17
Стадия : Mark
18
Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
18
Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
18
Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
18
Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
• Белые - непосещенные вершины.
18
Стадия : Mark
Алгоритм маркировки представляет собой (главным образом)
обход графа в глубину с использованием стека и трехцветной
абстракцией :
• Черные - вершины с посещенными и просканированными
ссылками.
• Серые - посещенные вершины с непросмотренными ссылками.
• Белые - непосещенные вершины.
Используется стек указателей, а не рекурсия. (Привет,
StackOverflow), и им является From Space из YoungGen.
18
STW Mark
19
STW Mark
20
STW Mark
21
STW Mark
22
STW Mark
23
STW Mark
24
STW Mark
25
STW Mark
26
STW Mark
27
STW Mark
28
STW Mark
29
STW Mark
30
Incremental Mark
31
Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
• За паузу сканируется часть хипа.
Incremental Mark
31
• Начинается, когда куча становится больше
некоего порогового значения, а не заполняется.
• Пауз становится больше, но они становятся
короче.
• За паузу сканируется часть хипа.
• Но взамен на эту всю красоту появляются
проблемы с консистентностью графа объектов.
32
Incremental Mark : трабла раз
Аллоцирование нового объекта в черном
объекте / указание ссылки на «мусорный»
объект.
33
Incremental Mark : трабла два
Удаление ссылки на черный объект.
Write Barriers уже выехали!
35
Write Barriers
35
Write Barriers
• Существует специальный буфер, в который
помещаются перехваченные записи в хип.
35
Write Barriers
• Существует специальный буфер, в который
помещаются перехваченные записи в хип.
• Удаления при этом обрабатываются. 

То есть, удаленные ссылки не считаются
удаленными до конца текущей раскраски
объектов. После они спокойно удаляются.
36
Порешаем траблы
Оставляем удаленную ссылку
37
Порешаем траблы
А давайте-ка покрасим родителя зеленой
ссылки в серый, и снова пройдемся по
его дочерним объектам и ссылкам.
ОПЯТЬ РАБОТАТЬ?
38
Порешаем траблы
А давайте-ка покрасим родителя зеленой
ссылки в серый, и снова пройдемся по его
дочерним объектам и ссылкам.
39
Порешаем траблы
А давайте-ка покрасим родителя зеленой
ссылки в серый, и снова пройдемся по его
дочерним объектам и ссылкам.
40
Порешаем траблы
А давайте-ка покрасим родителя зеленой
ссылки в серый, и снова пройдемся по его
дочерним объектам и ссылкам.
41
Порешаем траблы
Готово! 

И да, это не настолько дорого, как Вы подумали.

Эвристики нам в помощь :)
Стадия : Sweep
42
Стадия : Sweep
• Sweep чрезвычайно прост: он просто
выполняет линейный поиск мёртвых
объекты в каждой странице хипа, очищает
память, и передает ее в специальный
список свободной памяти.
42
Стадия : Sweep
43
Стадия : Sweep
• В каждой странице хранятся отдельные списки
свободной памяти для небольших регионов
(< 2^8 слов), средние регионы (< 2^11 слов),
большие регионы (< 2^14 слова) и огромные
регионы.
43
Стадия : Sweep
• В каждой странице хранятся отдельные списки
свободной памяти для небольших регионов
(< 2^8 слов), средние регионы (< 2^11 слов),
большие регионы (< 2^14 слова) и огромные
регионы.
• Свободные списки в основном используются
алгоритмом Scavenge для перемещения выживших
объектов в OldGen, a также используются
алгоритмом уплотнения для перемещения объектов.
43
Sweep наглядно
44
Фаза первая. Произошел GC reason.

Хип не помаркан – маркаем.
Sweep наглядно
45
Фаза вторая. Mark отработал, хип размечен.
Sweep наглядно
46
Фаза третья. В каждом регионе sweeper удалил
объекты и отдал память под повторную аллокацию.
Parallel Sweep
47
Parallel Sweep
• Так как хип размечен по регионам, выделить
N-ное количество потоков на уборку этих самых
регионов не составляет труда.
47
Parallel Sweep
• Так как хип размечен по регионам, выделить
N-ное количество потоков на уборку этих самых
регионов не составляет труда.
• Время паузы при этом заметно сокращается.
47
Стадия : Compact
48
Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
48
Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
• Главная проблема здесь - обеспечить
дефрагментацию страниц.
48
Стадия : Compact
• Самая сложная, на мой вкус, функция сборщика
мусора.
• Главная проблема здесь - обеспечить
дефрагментацию страниц.
• Порождает N-нное количество головняка у
разработчиков GC.
48
Как справился Google?
Как справился Google?
• Google может выдохнуть, так как на самом
деле JS не является многопоточным, и большое
количество нюансов, которые надо
предусмотреть в многопоточной среде языка,
исчезают.
• Но перенос внутри VM все равно происходит в
критической секции.
Compact крупно
50
Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
50
Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
• Для каждого живого объекта в эвакуируемом
регионе выделяется место из списка свободной
памяти другой страницы.
50
Compact крупно
• Compact переносит объекты из фрагментированных
регионов (содержащих много небольших свободных
пространств) в свободные места на других регионах.
• Для каждого живого объекта в эвакуируемом
регионе выделяется место из списка свободной
памяти другой страницы.
• Каждый объект копируется в выделенное место, а в
еще не удаленном объекте появляется так
называемый «forwarding pointer», указывающий на
настоящий объект.
50
Как Compact работает
51
Как Compact работает
51
Как Compact работает
51
Фаза раз : Есть фрагментированный хип. 

Сожмем?
Как Compact работает
52
Как Compact работает
52
Как Compact работает
52
Фаза два-с. Размечаем фрагментированные регионы.
Определяем для каждого объекта его новое место.
Перенос
53
Перенос
54
Перенос
55
Перенос
56
Compact работу закончил!
57
Compact работу закончил!
57
Готово!
Compact работу закончил!
57
Готово!
Перенос объектов
58
Перенос объектов
59
Как только эвакуация завершена, V8 выполняет итерацию по
списку записанных мест указателя и обновляет их, указывая на
новые копии.
Перенос завершён!
60
Compact молодец!
61
Compact молодец!
61
После уборки
62
После уборки
• Все объекты снова маркируются как «белые».
• GC прибирается в кэшах и деоптимизрует
отмеченные для деоптимизиации объекты.
• Отпускает паузу.
62
Выводы
63
Выводы
• Гуглу удалось создать коллектор, который балансирует
между средним временем паузы и оверхэдом на сборку.
При этом разработчики (большинство) довольны, так как
у них не возникает с ним проблем.
• Если уж приложение и тормозит, то вам стоит
покопаться в собственном коде и посмотреть на вкладку
«Performance», и проверить, а поэтому ли тормозит?
• Если да, то попросить приложение меньше мусорить.
63
Q/A?
64

More Related Content

Similar to Garbage collection in V8 VM

How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
Alexander Syrotenko
 
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей РагозинDUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозинit-people
 
Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]
aragozin
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
IT-Portfolio
 
Ренессанс графики на клиенте
Ренессанс графики на клиентеРенессанс графики на клиенте
Ренессанс графики на клиенте
Anton Korzunov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON
 
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
2ГИС Технологии
 
Дмитрий Кулижников
Дмитрий КулижниковДмитрий Кулижников
Дмитрий Кулижников
CodeFest
 
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
SpbDotNet Community
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Ontico
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04Computer Science Club
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Ontico
 
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest
 
Фламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньФламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый день
DevDay
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
Roman_Lut
 
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Mail.ru Group
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
Andrey Akinshin
 
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
Grid Dynamics
 

Similar to Garbage collection in V8 VM (20)

How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей РагозинDUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин
DUMP-2012 - Только хардкор! - "Секреты сборки мусора в Java" Алексей Рагозин
 
Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]Секреты сборки мусора в Java [DUMP-IT 2012]
Секреты сборки мусора в Java [DUMP-IT 2012]
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
 
G1
G1G1
G1
 
Ренессанс графики на клиенте
Ренессанс графики на клиентеРенессанс графики на клиенте
Ренессанс графики на клиенте
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
 
Дмитрий Кулижников
Дмитрий КулижниковДмитрий Кулижников
Дмитрий Кулижников
 
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
Андрей Акиньшин и Михаил Филиппов «Rider: разговоры про внутренности и кроссп...
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
 
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
 
Фламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый деньФламп на спидах или ка релизить каждый день
Фламп на спидах или ка релизить каждый день
 
Внедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движокВнедрение параллельного рендеринга в игровой движок
Внедрение параллельного рендеринга в игровой движок
 
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
Droidcon Moscow 2015. Android NDK - стоит ли игра свеч Дмитрий Юницкий - Mail...
 
Практические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложенийПрактические приёмы оптимизации .NET-приложений
Практические приёмы оптимизации .NET-приложений
 
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
 

Garbage collection in V8 VM

  • 3. Кто я такой? • Студент факультета кибернетики КНУ им. Шевченка. 2
  • 4. Кто я такой? • Студент факультета кибернетики КНУ им. Шевченка. • Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8). 2
  • 5. Кто я такой? • Студент факультета кибернетики КНУ им. Шевченка. • Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8). • Люблю копаться в движках и писать фронтенд. 2
  • 6. Кто я такой? • Студент факультета кибернетики КНУ им. Шевченка. • Пишу на C++, Java/Scala/Kotlin(JVM) и JS(V8). • Люблю копаться в движках и писать фронтенд. • Компиляторов, если что. 2
  • 7.
  • 9. Вся мудрость тут Все основные алгоритмы GC пользуют наработки этой книги
  • 10.
  • 12. GC в V8 • Как и во всех виртуальных машинах, существует система управления памятью : 5
  • 13. GC в V8 • Как и во всех виртуальных машинах, существует система управления памятью : • Аллокатор. 5
  • 14. GC в V8 • Как и во всех виртуальных машинах, существует система управления памятью : • Аллокатор. • Сборщик мусора (он же GC). 5
  • 16. Модель памяти в JS (V8) 6 • Отдельно представлены целые числа на стеке
  • 17. Модель памяти в JS (V8) 6 • Все остальные объекты, аллоцирующиеся в хипе, неявно наследуются от HeapObject. • Все объекты выровнены на 4 байта. • Отдельно представлены целые числа на стеке
  • 19. Как устроен Heap • New Space (aka YoungGen): Большинство объектов живут именно здесь. Умирают тоже. 7
  • 20. Как устроен Heap • New Space (aka YoungGen): Большинство объектов живут именно здесь. Умирают тоже. • Old Space (aka OldGen) : Объекты, пережившие одну и больше фаз сборки. 7
  • 21. Как устроен Heap • New Space (aka YoungGen): Большинство объектов живут именно здесь. Умирают тоже. • Old Space (aka OldGen) : Объекты, пережившие одну и больше фаз сборки. • Code Space: Здесь размещаются объекты кода, содержащие инструкции JIT-компилятора. Это единственное пространство с исполняемой памятью. 7
  • 22. Слабая гипотеза о поколениях 8
  • 23. Слабая гипотеза о поколениях • Объекты чаще всего не переживают следующей сборки после их рождения. 8
  • 24. Слабая гипотеза о поколениях • Объекты чаще всего не переживают следующей сборки после их рождения. • Объекты чаще всего умирают молодыми. 8
  • 25.
  • 27. Внезапная польза • Подобная гипотеза, подтвержденная частыми наблюдениями (не только в V8), позволяет разработчикам виртуальных машин делать некоторые спекулятивные операции. 10
  • 28. Внезапная польза • Подобная гипотеза, подтвержденная частыми наблюдениями (не только в V8), позволяет разработчикам виртуальных машин делать некоторые спекулятивные операции. • А именно - разделять сборки в регионах хипа, и разрабатывать разные алгоритмы для них. 10
  • 30. Подходы к сборке • Stop-the-world (город main-thread приложения засыпает, GC работает, после окончания приложение опять просыпается). 11
  • 31. Подходы к сборке • Stop-the-world (город main-thread приложения засыпает, GC работает, после окончания приложение опять просыпается). • Concurrent (сборщик (частями) работает параллельно с приложением). 11
  • 32. Подходы к сборке • Stop-the-world (город main-thread приложения засыпает, GC работает, после окончания приложение опять просыпается). • Concurrent (сборщик (частями) работает параллельно с приложением). • Важно : конкурентными могут быть несколько из фаз сборки! 11
  • 34. Стратегии сборки Всего существует аж 3 стратегии сборки мусора : 12
  • 35. Стратегии сборки Всего существует аж 3 стратегии сборки мусора : • No operations: считаем все объекты мусором, и творим тотальный экстерминатус всем обитателям хипа, вырубая работающую VM. 12
  • 36. Стратегии сборки Всего существует аж 3 стратегии сборки мусора : • No operations: считаем все объекты мусором, и творим тотальный экстерминатус всем обитателям хипа, вырубая работающую VM. • Mark-Sweep/Compact: помечаем все живые объекты, удаляем недостижимые (и делаем перемещение живых регионов). 12
  • 37. Стратегии сборки Всего существует аж 3 стратегии сборки мусора : • No operations: считаем все объекты мусором, и творим тотальный экстерминатус всем обитателям хипа, вырубая работающую VM. • Mark-Sweep/Compact: помечаем все живые объекты, удаляем недостижимые (и делаем перемещение живых регионов). • Pointer counting: присобачиваем к каждому объекту счетчик ссылок на него и удаляем его, когда счетчик равен нулю. 12
  • 39. Немного недоумения • Вообще-то, настоящим, на мой вкус, сборщиком мусора, является подход с подсчетом ссылок. 13
  • 40. Немного недоумения • Вообще-то, настоящим, на мой вкус, сборщиком мусора, является подход с подсчетом ссылок. • В Mark-* мы помечаем и перемещаем достижимые объекты, а не мусор! 13
  • 42. Сборка в YoungGen • Два субрегиона : «From Space» и «To Space» 14
  • 43. Сборка в YoungGen • Два субрегиона : «From Space» и «To Space» • «From Space» изначально пустой. 14
  • 44. Сборка в YoungGen • Два субрегиона : «From Space» и «To Space» • «From Space» изначально пустой. • К GC прилетел сигнал, что в «To Space» переполнение. 14
  • 45. Сборка в YoungGen • Два субрегиона : «From Space» и «To Space» • «From Space» изначально пустой. • К GC прилетел сигнал, что в «To Space» переполнение. • Также существует специальный Pointer Map на все объекты из Young Generation. 14
  • 48. Scavenger, Part 1 1. To Space переполнился*, GC начинает работу. 15
  • 49. Scavenger, Part 1 1. To Space переполнился*, GC начинает работу. 2. To Space и From Space обмениваются своим содержимым. 15
  • 52. Scavenger, Part 2 3. Проходимся линейно по From Space, помечаем живые объекты. 16
  • 53. Scavenger, Part 2 3. Проходимся линейно по From Space, помечаем живые объекты. 4. Перемещаем живые объекты в To Space, удаляем лишнее из From Space. 16
  • 54. Scavenger, Part 2 3. Проходимся линейно по From Space, помечаем живые объекты. 4. Перемещаем живые объекты в To Space, удаляем лишнее из From Space. 5. To Space отдает эти данные в OldGen. 16
  • 56. Сборка в OldGen Сборка в OldGen является классическим алгоритмом Mark-Compact: 17
  • 57. Сборка в OldGen Сборка в OldGen является классическим алгоритмом Mark-Compact: 1. Сначала, начиная из rootset, проходимся по всему графу объектов и помечаем достижимые. (Mark*) 17
  • 58. Сборка в OldGen Сборка в OldGen является классическим алгоритмом Mark-Compact: 1. Сначала, начиная из rootset, проходимся по всему графу объектов и помечаем достижимые. (Mark*) 2. Чистим хип. (Sweep) 17
  • 59. Сборка в OldGen Сборка в OldGen является классическим алгоритмом Mark-Compact: 1. Сначала, начиная из rootset, проходимся по всему графу объектов и помечаем достижимые. (Mark*) 2. Чистим хип. (Sweep) 3. Сжимаем хип. (Compact) 17
  • 61. Стадия : Mark Алгоритм маркировки представляет собой (главным образом) обход графа в глубину с использованием стека и трехцветной абстракцией : 18
  • 62. Стадия : Mark Алгоритм маркировки представляет собой (главным образом) обход графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. 18
  • 63. Стадия : Mark Алгоритм маркировки представляет собой (главным образом) обход графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. 18
  • 64. Стадия : Mark Алгоритм маркировки представляет собой (главным образом) обход графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. • Белые - непосещенные вершины. 18
  • 65. Стадия : Mark Алгоритм маркировки представляет собой (главным образом) обход графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. • Белые - непосещенные вершины. Используется стек указателей, а не рекурсия. (Привет, StackOverflow), и им является From Space из YoungGen. 18
  • 79. Incremental Mark 31 • Начинается, когда куча становится больше некоего порогового значения, а не заполняется.
  • 80. Incremental Mark 31 • Начинается, когда куча становится больше некоего порогового значения, а не заполняется. • Пауз становится больше, но они становятся короче.
  • 81. Incremental Mark 31 • Начинается, когда куча становится больше некоего порогового значения, а не заполняется. • Пауз становится больше, но они становятся короче. • За паузу сканируется часть хипа.
  • 82. Incremental Mark 31 • Начинается, когда куча становится больше некоего порогового значения, а не заполняется. • Пауз становится больше, но они становятся короче. • За паузу сканируется часть хипа. • Но взамен на эту всю красоту появляются проблемы с консистентностью графа объектов.
  • 83. 32 Incremental Mark : трабла раз Аллоцирование нового объекта в черном объекте / указание ссылки на «мусорный» объект.
  • 84. 33 Incremental Mark : трабла два Удаление ссылки на черный объект.
  • 85. Write Barriers уже выехали!
  • 87. 35 Write Barriers • Существует специальный буфер, в который помещаются перехваченные записи в хип.
  • 88. 35 Write Barriers • Существует специальный буфер, в который помещаются перехваченные записи в хип. • Удаления при этом обрабатываются. 
 То есть, удаленные ссылки не считаются удаленными до конца текущей раскраски объектов. После они спокойно удаляются.
  • 90. 37 Порешаем траблы А давайте-ка покрасим родителя зеленой ссылки в серый, и снова пройдемся по его дочерним объектам и ссылкам. ОПЯТЬ РАБОТАТЬ?
  • 91. 38 Порешаем траблы А давайте-ка покрасим родителя зеленой ссылки в серый, и снова пройдемся по его дочерним объектам и ссылкам.
  • 92. 39 Порешаем траблы А давайте-ка покрасим родителя зеленой ссылки в серый, и снова пройдемся по его дочерним объектам и ссылкам.
  • 93. 40 Порешаем траблы А давайте-ка покрасим родителя зеленой ссылки в серый, и снова пройдемся по его дочерним объектам и ссылкам.
  • 94. 41 Порешаем траблы Готово! 
 И да, это не настолько дорого, как Вы подумали.
 Эвристики нам в помощь :)
  • 96. Стадия : Sweep • Sweep чрезвычайно прост: он просто выполняет линейный поиск мёртвых объекты в каждой странице хипа, очищает память, и передает ее в специальный список свободной памяти. 42
  • 98. Стадия : Sweep • В каждой странице хранятся отдельные списки свободной памяти для небольших регионов (< 2^8 слов), средние регионы (< 2^11 слов), большие регионы (< 2^14 слова) и огромные регионы. 43
  • 99. Стадия : Sweep • В каждой странице хранятся отдельные списки свободной памяти для небольших регионов (< 2^8 слов), средние регионы (< 2^11 слов), большие регионы (< 2^14 слова) и огромные регионы. • Свободные списки в основном используются алгоритмом Scavenge для перемещения выживших объектов в OldGen, a также используются алгоритмом уплотнения для перемещения объектов. 43
  • 100. Sweep наглядно 44 Фаза первая. Произошел GC reason.
 Хип не помаркан – маркаем.
  • 101. Sweep наглядно 45 Фаза вторая. Mark отработал, хип размечен.
  • 102. Sweep наглядно 46 Фаза третья. В каждом регионе sweeper удалил объекты и отдал память под повторную аллокацию.
  • 104. Parallel Sweep • Так как хип размечен по регионам, выделить N-ное количество потоков на уборку этих самых регионов не составляет труда. 47
  • 105. Parallel Sweep • Так как хип размечен по регионам, выделить N-ное количество потоков на уборку этих самых регионов не составляет труда. • Время паузы при этом заметно сокращается. 47
  • 107. Стадия : Compact • Самая сложная, на мой вкус, функция сборщика мусора. 48
  • 108. Стадия : Compact • Самая сложная, на мой вкус, функция сборщика мусора. • Главная проблема здесь - обеспечить дефрагментацию страниц. 48
  • 109. Стадия : Compact • Самая сложная, на мой вкус, функция сборщика мусора. • Главная проблема здесь - обеспечить дефрагментацию страниц. • Порождает N-нное количество головняка у разработчиков GC. 48
  • 111. Как справился Google? • Google может выдохнуть, так как на самом деле JS не является многопоточным, и большое количество нюансов, которые надо предусмотреть в многопоточной среде языка, исчезают. • Но перенос внутри VM все равно происходит в критической секции.
  • 113. Compact крупно • Compact переносит объекты из фрагментированных регионов (содержащих много небольших свободных пространств) в свободные места на других регионах. 50
  • 114. Compact крупно • Compact переносит объекты из фрагментированных регионов (содержащих много небольших свободных пространств) в свободные места на других регионах. • Для каждого живого объекта в эвакуируемом регионе выделяется место из списка свободной памяти другой страницы. 50
  • 115. Compact крупно • Compact переносит объекты из фрагментированных регионов (содержащих много небольших свободных пространств) в свободные места на других регионах. • Для каждого живого объекта в эвакуируемом регионе выделяется место из списка свободной памяти другой страницы. • Каждый объект копируется в выделенное место, а в еще не удаленном объекте появляется так называемый «forwarding pointer», указывающий на настоящий объект. 50
  • 118. Как Compact работает 51 Фаза раз : Есть фрагментированный хип. 
 Сожмем?
  • 121. Как Compact работает 52 Фаза два-с. Размечаем фрагментированные регионы. Определяем для каждого объекта его новое место.
  • 130. Перенос объектов 59 Как только эвакуация завершена, V8 выполняет итерацию по списку записанных мест указателя и обновляет их, указывая на новые копии.
  • 135. После уборки • Все объекты снова маркируются как «белые». • GC прибирается в кэшах и деоптимизрует отмеченные для деоптимизиации объекты. • Отпускает паузу. 62
  • 137. Выводы • Гуглу удалось создать коллектор, который балансирует между средним временем паузы и оверхэдом на сборку. При этом разработчики (большинство) довольны, так как у них не возникает с ним проблем. • Если уж приложение и тормозит, то вам стоит покопаться в собственном коде и посмотреть на вкладку «Performance», и проверить, а поэтому ли тормозит? • Если да, то попросить приложение меньше мусорить. 63