Это 82-я оригинальная статья без воды. Если вы хотите получить больше оригинальных статей, выполните поиск в общедоступном аккаунте и подпишитесь на нас~ Эта статья была впервые опубликована в блоге Zhengcaiyun:Сборка мусора двигателя V8 и выделение памяти
написать впереди
Если рабочий хочет сделать хорошую работу, он должен сначала заточить свой инструмент.Инструмент в этой статье не инструмент, а контейнер.Приступим к делу.Как фронтенд-воркер, я просто определяю константы с помощью const в левой руке.Хотя игра,действительно отличный jser,за кокетливой операцией,должно быть QWER день и ночь,плюс прогулка А,не много ерунды,какое ядро браузера? Не знаете, какие бывают ядра браузеров? Тогда давайте сначала взглянем на ядро браузера.
ядро браузера
Когда дело доходит до ядра браузера, вам подойдут Blink, Weikit, Gecko и Trident. Это всего лишь один из движков рендеринга каждого ядра браузера. Соответствующий движок JavaScript также указан здесь:
браузер | движок рендеринга | Javascript-движок |
---|---|---|
Chrome | Blink (с использованием Safari's Webkit 13 лет назад, Blink был разработан Google и Opera) | V8 |
Safari | Webkit | JavaScriptCore |
Firefox | Gecko | SpiderMonkey--OdinMonkey |
IE | Trident | Chakra |
Механизм рендеринга и механизм JS взаимодействуют друг с другом для создания страницы, отображаемой браузером, как показано на следующем рисунке:
Просто взгляните на это, это не имеет значения, так как речь идет о сборке мусора (Garbage Collection для краткости GC), то вам нужно сначала перейти к корзине.Корзина имеет научное название:ОЗУ, одно из ядер памяти, одно из пяти аппаратных средств компьютера, см. рисунок ниже:
Что менее важно, JS не имеет возможности управлять памятью и сборкой мусора, все зависит от JS движка каждого браузера, так что для форсирования более высокого уровня не говорите про сборку мусора JS, понимаете, я говорю V8 мусор сбор, стало намного лучше (дотронулся до головки, не оказывающей сопротивления).
выделение памяти
куча
Проще говоря, стековая память мала и непрерывна в хранении, проста и удобна в работе, как правило, она автоматически выделяется и утилизируется системой, поэтому упомянутая в статье сборка мусора основана на куче памяти.
куча
Память кучи, большая (относительно стека) и не непрерывная.
Классификация памяти в V8
Прежде чем говорить о распределении памяти, давайте разберемсягипотеза слабого поколения, сборка мусора V8 в основном основана на этой гипотезе.
концепция:
- У большинства объектов очень короткий жизненный цикл, то есть время выживания очень короткое.
- Объекты с длительным жизненным циклом в основном являются резидентными объектами.
Основываясь на двух вышеуказанных концепциях, память делится на новое поколение (новое пространство).иСтарое пространство**Два региона. Сосредоточьтесь на нем, запомните его.
вывоз мусора
Кайнозой
Кайнозой(32-битная система выделяет 16М памяти, 64-битная система удваивает 32М, разные браузеры могут отличаться, но сильно отличаться не должно).
Новое поколение соответствует гипотетической концепции короткого времени выживания.Операция этого пространства очень частая.Большинство объектов переживают здесь цикл жизни и смерти и в основном вымирают.Те, кто не умирают,будут переведены в старое поколение.
Алгоритм нового поколения — это алгоритм Scavenge, типичная расточительная штука, жертвующая пространством ради времени Как бы это сказать? Сначала он делит молодое поколение на два равных полупространства (полупространства)from spaceиto space, давайте посмотрим, как работает эта блудница, он использует алгоритм в ширину, то есть в ширину, помните. Два пространства, при этом только одно пространство работает (из пространства), а другое отдыхает (в пространство).
-
Прежде всего, сборщик мусора в движке V8 обнаруживает, что объем памяти from space вот-вот достигнет верхнего предела, и в это время требуется сборка мусора.
-
Тогда при обходе от корня недостижимые объекты (т. е. объекты, обход которых невозможен) будутОн отмечен, и скопируйтебез опознавательных знаковобъект, поместите его в пространство
-
Наконец, очистите данные из пространства и в то же время установите из пространства в состояние ожидания, то есть оно становится в пространство, а соответствующее пространство становится из пространства, обычно известное как переворачивание
Да, вы сказали, что пространство ему дано, он может распоряжаться им как хочет.Нельзя заставить директора Ванга открыть подержанный Альто.Конечно, для мелких предметов, если вы придете вот так один раз, преимущество во времени будет использовано. , хотя половина места была потрачена впустую, но проблема не большая, может держать живой.
Конечно, превосходный V8 не может этого вынести.Объект прыгает туда-сюда между пространством формы и пространством.После того, как форма => перевернуть, обнаруживается, что некоторые немаркированные объекты все еще там и будут брошены прямо в пространство. Переходя к старому поколению, кажется, что Хоулан участвовал в конкурсе и прошел отбор, отличный ле.
В дополнение к вышеуказанной ситуации, есть еще одна ситуация, которая также будет продвигаться.Когда копируется объект, когда он превышает 25% пространства, он также будет продвигаться.Этот тип игрока с фоном, который это не те, кто осмелится переехать, будут напрямую переведены в старое поколение.
старое поколение
старое поколение(32-битная операционная система выделяет около 700М памяти, 64-битная удваивает 1,4Гб, то же самое, у каждого браузера может отличаться, но не сильно).
Старое поколение намного сложнее, чем новое поколение.Так называемые способные люди работают больше, пространство большое, а ответственность больше.Старое поколение можно разделить на следующие направления:
- **старое пространство объектов ** это старое поколение у всех на слуху, а не все старое поколение, большинство объектов здесь продвинуты из нового поколения
- **большое пространство объектов **Область хранения больших объектов.Здесь будут размещены объекты, которые не могут быть сохранены в других областях, в основном объекты, превышающие 1M.Такие объекты не будут размещены в объектах нового поколения, а будут храниться непосредственно здесь, Конечно, сейчас такие большие данные, стоимость копирования очень высока, в основном здесь ждет судьба
- **Пространство карты** Эта штука предназначена для хранения отношения сопоставления объектов. На самом деле это скрытый класс. Что такое скрытый класс? Я не скажу вам (большой парень, который не знает, уже ушел в Baidu)
- **кодовое пространство** Проще говоря, это место, где хранится код Скомпилированный код — это код, скомпилированный в соответствии с кодом, написанным большими парнями
Посмотрите на картинку и отдохните:
После обсуждения многих основных концепций давайте поговорим о последнем алгоритме повторного использования старого поколения.
В процессе маркировки вводится понятие: метод трехцветной маркировки, три цвета:
- Белый: неотмеченные объекты, то есть недостижимые объекты (объекты, которые не сканируются), могут быть переработаны.
- Серый: объект помечен (доступный объект), но объект не сканирован и не может быть повторно использован.
- Черный: он был отсканирован (доступные объекты) и не может быть восстановлен.
Конечно, поскольку вы хотите пометить, вам нужно предоставить записанную яму, и растровая яма маркировки создается в каждой странице памяти, выделенной в V8.
Общий процесс таков:
- Сначала пометьте все некорневые объекты белым цветом, а затем используйте обход в глубину, который отличается от нового поколения обходом в глубину. в стек.Помещаем результат маркировки в битмап маркировки (серый), обход объекта завершен, вытаскиваем его из стека напрямую и записываем как черный в битмап маркировки, пока стек не опустеет, делаем снимок и сделать перерыв
-
После того, как разметка завершена, следующий шаг - дождаться, когда сборщик мусора ее очистит.После очистки в исходной области памяти останется много прерывистого места. что я должен делать? Он может только запускать GC, но оказывается, что прерывистое пространство, которое было очищено, может складываться в этого глупого большого человека.Жаль, что производительность запуска GC также падает в размахе, V8 может это терпеть .случилось? Наверняка его не существует!
-
Таким образом, после очистки, когда объекты нового поколения снова размещаются на старом поясе, а памяти недостаточно, сначала сработает маркировка-компакт, которая после завершения маркировки переместит доступные объекты (черные) в At другой конец памяти, другое пространство памяти не будет занято, и оно будет освобождено напрямую.Когда в следующий раз будет продвижение другого объекта, его легко подавить.
Увидев это, у вас могут возникнуть вопросы.Если у меня есть еще один объект после завершения GC, что мне делать, если он полон?Что вы скажете?Память дорожить,память-это как дорожить своей девушкой,что? У тебя нет девушки? Тогда никак, в принципе эту проблему не решить.
Базовая память и сборка мусора были объяснены, и в ней еще есть некоторые понятия, мне еще нужно поговорить об этом, а потом смотреть вниз!
написать барьер
Подумайте над вопросом, когда GC хочет восстановить содержимое в новом поколении, некоторые объекты имеют только один указатель, указывающий на него.По совпадению, этот указатель все еще указывает на объект в старом поколении.Что делать? Я хочу переработать эту штуку, нужно ли мне проходить объекты в старом поколении? Разве это не шутка? Чтобы переработать эту штуку, мне нужно пройти через все старое поколение.
В двигателе V8 есть концепция, называемаянаписать барьер,Есть кеш-лист куда записывается объект.В этот список записываются все ситуации когда старое поколение указывает на новое поколение.Конечно вновь сгенерированные объекты записываться не будут.Только объекты из старого поколения указывающие на новое поколение генерация будет записана в этот список кеша.
При запуске GC в новом поколении и встрече с таким объектом он сначала прочитает список кеша.По сравнению с обходом всех объектов в старом поколении стоимость слишком мала.Эта операция стоит волны 666, что отлично, конечно, есть еще много, много о внутренней оптимизации двигателя V8, вы можете узнать об этом постепенно.
остановить мир
По поводу полной паузы отдельно говорить не приходится, но я рад, что это хорошо.
Раньше включались как новые, так и старые ремни.Для того, чтобы логика и сборка мусора были несогласованными, нужно было останавливать работу JS, а для траверса траверс/копировать, отмечать/очищать, эта пауза : полная пауза.
Это довольно отвратительно, и новое поколение не имеет большого значения.Сама память невелика, и время неочевидно.Однако в старом поколении, если слишком много объектов для обхода, слишком больших, то пользователь, очевидно, может чувствовать страницу в это время Катон, опыт шарлатан.
Поэтому в проекте под названием Orinoco двигатель V8 сделал три вещи, конечно, только для старого поколения, новое поколение еще возможно, КПД высокий, а возможностей для оптимизации не так много. Три вещи:
- Инкрементные маркеры
Делайте то, что было изначально помечено, за один раз, и делайте это шаг за шагом.Каждый раз, когда использование памяти достигает определенного значения или барьер записи многократно вводится, программа JS временно останавливается, и пометка выполняется на некоторое время. максимум десятки миллисекунд за раз.В момент ГК фронт все равно маркируется, и этого достаточно, чтобы начать очистку
- Параллельная коллекция
Буквально параллельно, то есть в процессе полной сборки мусора, движок V8 запускает несколько вспомогательных потоков для совместной очистки мусора, что позволяет сильно сократить время сборки мусора.Отлично, и мне нравится вручную.
- Параллельная коллекция
Параллелизм — это когда работает основной поток JS, одновременно открывается вспомогательный поток и вычищается мусор, не имеющий логической связи с основным потоком.Конечно, требуется барьер записи для обеспечения
резюме
В движке V8 реализовано множество оптимизаций. Например, объекты, которые могут сохраняться в новом поколении много раз (2 раза), будут записаны и будут непосредственно переведены в старое поколение в следующем сборщике мусора. прямо помечен черным цветом. Это связано с тем, что вероятность выживания недавно продвинутых объектов очень высока. Даже если эти две ситуации больше не используются, они будут очищены в следующий раз, что мало влияет, но в этом процессе первый тип сохраняет цикл копирования в новом поколении, а второй тип сохраняет процесс маркировки, что более выгодно, когда таких объектов много.
Последнее предложение
Наконец-то я закончил писать, изначально хотел написать больше подробностей, но это было бы слишком много места.В следующий раз, если будет возможность, я напишу о процессе выполнения V8 или о том, что V8 делал для создания объектов.На самом деле , Двигатель V8 (или различные двигатели JS) слишком велик, и то, что я знаю, это только верхушка айсберга, поэтому в статье должны быть неточности.Приветствую больших парней, чтобы они меня поправили и активно общались.
Рекомендуемое чтение
Как младшие инженеры быстро растут и ищут прорывы
Карьера
ZooTeam, молодая, увлеченная и творческая команда, связанная с отделом исследований и разработок продукции Zhengcaiyun, базируется в живописном Ханчжоу. В настоящее время в команде более 40 фронтенд-партнеров, средний возраст которых составляет 27 лет, и почти 30% из них — инженеры полного стека, настоящая молодежная штурмовая группа. В состав членов входят «ветераны» солдат из Ali и NetEase, а также первокурсники из Чжэцзянского университета, Университета науки и технологий Китая, Университета Хандянь и других школ. В дополнение к ежедневным деловым связям, команда также проводит технические исследования и фактические боевые действия в области системы материалов, инженерной платформы, строительной платформы, производительности, облачных приложений, анализа и визуализации данных, а также продвигает и внедряет ряд внутренних технологий. Откройте для себя новые горизонты передовых технологических систем.
Если вы хотите измениться, вас забросали вещами, и вы надеетесь начать их бросать; если вы хотите измениться, вам сказали, что вам нужно больше идей, но вы не можете сломать игру; если вы хотите изменить , у вас есть возможность добиться этого результата, но вы не нужны; если вы хотите изменить то, чего хотите достичь, вам нужна команда для поддержки, но вам некуда вести людей; если вы хотите изменить установившийся ритм, это будет "5 лет рабочего времени и 3 года опыта работы"; если вы хотите изменить исходный Понимание хорошее, но всегда есть размытие того слоя оконной бумаги.. , Если вы верите в силу веры, верьте, что обычные люди могут достичь необыкновенных вещей, и верьте, что они могут встретить лучшего себя. Если вы хотите участвовать в процессе становления бизнеса и лично способствовать росту фронтенд-команды с глубоким пониманием бизнеса, надежной технической системой, технологиями, создающими ценность, и побочным влиянием, я думаю, что мы должны говорить. В любое время, ожидая, пока вы что-нибудь напишете, отправьте это наZooTeam@cai-inc.com