Сборщик мусора в V8, иллюстрированное руководство

Andrey Melikhov
Mar 31, 2017 · 4 min read

Перевод статьи Ирины Шестак. Garbage collection in V8, an illustrated guide. Опубликовано с разрешения автора.

Это руководство отличается от тех, что я делала раньше, и содержит немного сопровождающего текста вместе с эскизами. Я подумала, что вся концепция сборки мусора и то, как она обрабатывается в javascript (или, точнее, в движках javascript), заслуживает более подробного объяснения. Я также хотела бы упомянуть, что это руководство предназначено для начинающих пользователей и не охватывает все аспекты управления памятью в V8 и другие внутренности V8. Если же вы хотите исследовать глубже, то я в конце статья приложила ссылки на несколько полезных ресурсов. Также, это руководство сосредоточено на ✨javascript✨ и, очевидно, что сборка мусора в нём отличается от сборки мусора в других языках, таких, как, например, C (примечание переводчика: в C/C++ нет автоматических сборщиков мусора).

Хорошо, давайте приступим.

Что такое v8?

Что такое сборщик мусора?

Поскольку у нас нет доступа к бесконечному объему памяти, работа сборщика мусора заключается в том, что нужно перебрать все объекты, для которых выделена память, и определить, мертвы они или нет. Те, которые живы, должны остаться в памяти, те, которые мертвы, удаляются, а память возвращается обратно в кучу.

Что такое куча? Куча — это неструктурированная область, из которой объекты получают выделенную память. Распределение является динамическим, поскольку размер / время жизни / количество объектов неизвестно, поэтому выделение и освобождение памяти происходит во время выполнения программы.

Поэтому, если мы посмотрим на конкурентную модель, куча работает непосредственно со стеком вызовов, так как объекты, отображаемые в стеке, требуют выделения памяти. Это будет выглядеть примерно так:

Image for post
Image for post

Живой или мёртвый?

Некоторые C++ биндинги (или веб-API на клиенте) также являются частью корня, поэтому вы можете напрямую обращаться к методам типа setInterval.

О достижимости можно также думать так: сможет ли другой объект или корневой объект получить его, и если да, то память, требуемая для этого объекта, сохраняется.

Итак, как мы можем добраться до сборки мусора? (Расскажи мне! Расскажи мне!)

Image for post
Image for post

В целях сбора мусора V8 делит кучу на две части: молодое и старое пространство. Когда вы выполняете операции, требующие выделения памяти, V8 выделяет место в первой части. Когда вы продолжаете добавлять вещи в кучу, вы в конечном итоге исчерпываете память, поэтому V8 будет запускать очистку. Для вновь созданных объектов память выделяется очень быстро из короткой и быстрой коллекции, очищаемой на регулярной основе (для удаления уже мертвых объектов). Как только объекты «переживают» несколько (2, чтобы быть точными) циклов очистки, они переносятся в старое пространство, обрабатывающееся сборщиком мусора в отдельном цикле по факту заполнения.

Image for post
Image for post

Старые объекты — это те, которые пережили более одного цикла сборки мусора, то есть на них продолжают ссылаться другие объекты, и они должны оставаться в памяти. Обычно они не ссылаются на молодые объекты, но продолжают иметь ссылки на более старые объекты. Нежелательно допускать смешение поколений, так как это делает уборку менее чистой.

🆒 sources.js

  • это действительно хороший и детальный справочник по производительности v8.
  • вы можете заглянуть в v8 wiki для получения большей информации о внутренней работе v8 и том, как отлаживать ваши проекты.
  • о “частоте кадров” в firefox dev tools
  • другое хорошее руководство V8 && garbage collection

Эта статья на GitHub


Читайте нас на Медиуме, контрибьютьте на Гитхабе, общайтесь в группе Телеграма, следите в Твиттере и канале Телеграма, скоро подъедет подкаст. Не теряйтесь.

devSchacht

Подкаст. Переводы. Веб-разработка.

Andrey Melikhov

Written by

Web-developer in big IT company Перевожу всё, до чего дотянусь. Иногда (но редко) пишу сам.

devSchacht

Подкаст. Переводы. Веб-разработка.

Andrey Melikhov

Written by

Web-developer in big IT company Перевожу всё, до чего дотянусь. Иногда (но редко) пишу сам.

devSchacht

Подкаст. Переводы. Веб-разработка.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store