живут именно здесь. Умирают тоже. • Old Space (aka OldGen) : Объекты, пережившие одну и больше фаз сборки. • Code Space: Здесь размещаются объекты кода, содержащие инструкции JIT-компилятора. Это единственное пространство с исполняемой памятью. 7
в V8), позволяет разработчикам виртуальных машин делать некоторые спекулятивные операции. • А именно - разделять сборки в регионах хипа, и разрабатывать разные алгоритмы для них. 10
работает, после окончания приложение опять просыпается). • Concurrent (сборщик (частями) работает параллельно с приложением). • Важно : конкурентными могут быть несколько из фаз сборки! 11
• No operations: считаем все объекты мусором, и творим тотальный экстерминатус всем обитателям хипа, вырубая работающую VM. • Mark-Sweep/Compact: помечаем все живые объекты, удаляем недостижимые (и делаем перемещение живых регионов). 12
• No operations: считаем все объекты мусором, и творим тотальный экстерминатус всем обитателям хипа, вырубая работающую VM. • Mark-Sweep/Compact: помечаем все живые объекты, удаляем недостижимые (и делаем перемещение живых регионов). • Pointer counting: присобачиваем к каждому объекту счетчик ссылок на него и удаляем его, когда счетчик равен нулю. 12
«To Space» • «From Space» изначально пустой. • К GC прилетел сигнал, что в «To Space» переполнение. • Также существует специальный Pointer Map на все объекты из Young Generation. 14
графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. 18
графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. • Белые - непосещенные вершины. 18
графа в глубину с использованием стека и трехцветной абстракцией : • Черные - вершины с посещенными и просканированными ссылками. • Серые - посещенные вершины с непросмотренными ссылками. • Белые - непосещенные вершины. Используется стек указателей, а не рекурсия. (Привет, StackOverflow), и им является From Space из YoungGen. 18
порогового значения, а не заполняется. • Пауз становится больше, но они становятся короче. • За паузу сканируется часть хипа. • Но взамен на эту всю красоту появляются проблемы с консистентностью графа объектов.
перехваченные записи в хип. • Удаления при этом обрабатываются. То есть, удаленные ссылки не считаются удаленными до конца текущей раскраски объектов. После они спокойно удаляются.
свободной памяти для небольших регионов (< 2^8 слов), средние регионы (< 2^11 слов), большие регионы (< 2^14 слова) и огромные регионы. • Свободные списки в основном используются алгоритмом Scavenge для перемещения выживших объектов в OldGen, a также используются алгоритмом уплотнения для перемещения объектов. 43
самом деле JS не является многопоточным, и большое количество нюансов, которые надо предусмотреть в многопоточной среде языка, исчезают. • Но перенос внутри VM все равно происходит в критической секции.
много небольших свободных пространств) в свободные места на других регионах. • Для каждого живого объекта в эвакуируемом регионе выделяется место из списка свободной памяти другой страницы. 50
много небольших свободных пространств) в свободные места на других регионах. • Для каждого живого объекта в эвакуируемом регионе выделяется место из списка свободной памяти другой страницы. • Каждый объект копируется в выделенное место, а в еще не удаленном объекте появляется так называемый «forwarding pointer», указывающий на настоящий объект. 50
временем паузы и оверхэдом на сборку. При этом разработчики (большинство) довольны, так как у них не возникает с ним проблем. • Если уж приложение и тормозит, то вам стоит покопаться в собственном коде и посмотреть на вкладку «Performance», и проверить, а поэтому ли тормозит? • Если да, то попросить приложение меньше мусорить. 63