Подробное объяснение двигателя V8 (6) - структура памяти

JavaScript

предисловие

Эта статья является шестой в серии подробностей о движке V8. Основное внимание уделяется структуре памяти V8 и процессу использования памяти в целом. Эта статья начнется с основных понятий, понимания структуры стека V8 и, наконец, описания объекта после его создания.Жизненный цикл в памяти (в этой статье не будет много материалов, связанных с GC, а сборка мусора будет подробно описана в следующей статье).Ссылки на законченный цикл статей будут на конец статьи. Эта серия статей все еще обновляется. Добро пожаловать, чтобы продолжать обращать внимание.

что такое память

Обычно мы говорим, что компьютер состоит из 5 частей: контроллер, арифметическое устройство, устройство вывода, устройство вывода,Память, а память, о которой мы говорим, обычно относится к памяти, и инструкции и данные, которые ЦП должен вызывать при работе программы, можно получить только через память (жесткий диск имеет только функцию хранения, а данные будет кэшироваться в памяти во время выполнения), поэтому неважно, на каком языке написана программа, время выполнения зависит от памяти, а жизненный цикл памяти в основном одинаков:

  • Выделите необходимую память
  • Использовать выделенную память (чтение, запись)
  • Отпустите его, когда он не нужен\возвращается

И во многих статьях говорится о памяти javascript.На самом деле я считаю это утверждение неточным.Javascript сам по себе всего лишь язык.Настоящее выделение памяти вызовов-это движок,от которого зависит javascript.В этой статье я кратко расскажу о V8 , структура памяти.

Краткое описание кучи и стека

зачем куча и стек

В двигателе V8 его можно условно разделить на две части.кучаа такжекуча.
Этот стек означаетстек вызовов, Во-первых, характеристики стека LIFO (характеристики стека в общем смысле здесь разрабатываться не будут, в Интернете есть много статей на эту тему), а пространство стека непрерывное. быть выделены и уничтожены, нужно перемещать только нижний указатель, поэтому он отлично подходит для управления вызовами функций.

И только потому, что пространство стека является непрерывным, его пространство обречено быть очень ограниченным, поэтому хранить большие данные неудобно, тогда мы используемкуча памятидля управления и сохранения некоторых больших данных.

базовые типы и ссылочные типы

Вот два типа переменных:переменная базового типаа такжетип ссылочной переменной, основные типы переменных включают undefined, null, Number, String, Boolean, Symbol, а ссылочные типы переменных включают: Object, Array, Function и т. д. Фактически, в js Array и Function основаны на Object, мы можем понять Тип ссылочной переменной относится к Object.
(Некоторые люди здесь могут сказать, что null не должен быть типом объекта с нулевым указателем, typeof null === 'Object' должен считаться объектом, на самом деле это историческое наследие дизайна, и для системы V8 оба null а Undefined — просто фиксированное значение, существующее в стеке).

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

Давайте просто посмотрим на кусок кода через картинку.

var a = 123;
var b = 'abc';
var c = {x: 1};
var d = 123;
var f = c;
var g = {x: 1};

Значение базового типа откроет пространство памяти при его создании и сохранит адрес памяти в соответствующей переменной.Если в это время создается другой базовый тип, который эквивалентен ранее созданному значению, адрес будет непосредственно хранится во вновь созданной переменной. , поэтому будетa === d.

Затем, если объект создан, в куче будет открыто место для хранения объекта, и адрес памяти будет сохранен в соответствующей переменной.Если в это время создается новая переменная (f), ей будет присвоено адрес ранее созданного объекта хранилища.переменная (c), затем назначьте адрес памяти кучи, хранящийся в переменной c, переменной f, будетc === f.

Если в это время будет создана новая объектная переменная g, в куче будет создано другое пространство для создания объекта, и адрес будет присвоен g, но даже если содержимое объекта такое же, адреса указывают на два пробела, будетg !== c.

Вызов функции также хорошо понятен, и он также представлен фрагментом кода и картинкой следующим образом:

function main() {
    func1();
}
function func1() {
    func2();
    func3();
};
function func2() {};
function func3() {};
main();

В процессе вложенных вызовов между функциями внешняя функция освобождаться не будет, а пространство стека ограничено и имеет строгое числовое ограничение, поэтому при использовании рекурсии обращайте внимание на то, не будет ли онапереполнение.

Ядро управления памятью V8 — куча

Управление стеком часто проще, управляется указателем движения вверх и вниз, а управление стеком относительно сложно, а сборка мусора изготовления мусора, как правило, в основном направляется на кучу.

Структура пространства кучи

Давайте сначала посмотрим на структуру памяти:

(Источник изображения:Woohoo. ИМО OC.com/article/300…
Инициализированное пространство памяти движка V8 в основном делит память кучи на следующие области:

  • Область памяти нового поколения (новое пространство)
    Новое поколение области памяти разделено на два полупространства, размер полупространства по умолчанию составляет 16 МБ для каждого нового поколения, что обычно составляет только размер области памяти 32 МБ (64), которые представляют собой два полупространства из пространства и в пространство (есть конкретные Что бы сказать с ниже) вновь созданный объект обычно сначала помещают в одно из этих двух полупространств.

  • старое пространство
    Объекты обычно хранятся более настойчиво, а также делятся на две областиold pointer spaceа такжеold data spaceОни используются для хранения информации об указателе и информации о данных, которые переживают GC соответственно.

  • пространство для больших объектов
    Здесь хранятся объекты, объем которых превышает размер других областей.Во избежание копирования больших объектов, это пространство используется для хранения больших объектов.

  • Площадь единицы, площадь единицы свойства, область карты (пространство ячейки, пространство ячейки свойства, пространство карты)
    Пространство карты хранит информацию о карте объекта, т.е.Хиден КлассМаксимальное ограничение составляет 8 МБ; размер каждого объекта карты фиксирован, поэтому пространство разделено для быстрого позиционирования.

  • кодовое пространство
    В основном он хранит объекты кода, максимальный предел составляет 512 МБ, а также это единственная память с разрешением на выполнение.

Жизненный цикл работы памяти

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

Здесь мы предполагаем, что объект obj создан, сначала поговорим о немЗона памяти молодого поколенияДва пространстваfrom spaceа такжеto spaceэффект.

  • Первый объект будет выделенКайнозойОдно из двух пространств в пространстве, здесь мы предполагаем, что оно выделено для пространства from.
  • Поскольку программа продолжает выполняться, информация о новых объектах будет непрерывно добавляться в пространство из пространства. В это время пространство из пространства достигнет верхнего предела хранения (16 МБ), и механизм сборки мусора V8 начнет очищать объекты из этого больше не используются (то есть не используются объектом, на который указывает).
  • После очистки все объекты, которые еще живы (мы предполагаем, что obj еще жив), будут скопированы в пространство to, а затем все объекты в пространстве from будут удалены.
  • В это время программа продолжает работать. Если есть вновь созданные объекты, они будут постоянно размещаться в пространстве to. Когда пространство to почти заполнено, вышеупомянутая работа по копированию и переносу выполняется повторно.

То есть созданный объект будет передаваться между пространством и из пространства, что является так называемым процессом обмена ролями в --> из, из --> в.

(В центре внимания этой статьи не сборка мусора, поэтому многое, связанное с GC, будет не очень подробным)

Далее поговоримобласть памяти старого поколения, теперь продолжайте смотреть на упомянутый выше объект obj:

  • После того, как программа работает в течение определенного периода времени, obj все еще сохраняется в области памяти нового поколения и, наконец, удовлетворяет условиям для продвижения и переносится в область памяти старого поколения.
  • Через некоторое время на объект obj, наконец, не ссылаются, и в то же время пространство области памяти старого поколения также занимает много места, V8 пройдет в старом поколении и обнаружит, что на объект obj больше нет ссылок. , так что дайте ему отметить.
  • Поскольку V8 является однопоточным механизмом выполнения, чтобы не тратить слишком много времени на одну очистку, V8 будет повторно использовать помеченные объекты для очистки в пакетном режиме, и этот объект будет освобожден в памяти.

Суммировать

В этой статье в основном изучаются некоторые понятия памяти и структуры памяти V8, а также некоторые функции каждой части.На самом деле, будь то интервью или ежедневная работа, понимание механизма памяти V8 нам очень поможет.Я буду сосредоточиться на механизме рециркуляции памяти V8. Если есть какие-либо ошибки, пожалуйста, обсудите с автором в комментариях.Если вы считаете, что эта статья была вам полезна, пожалуйста, помогите и поставьте лайк, большое спасибо.

Справочная статья

Woohoo. ИМО OC.com/article/300…

серия статей

Подробное описание двигателя V8 (1) — обзор
Подробное объяснение двигателя V8 (2) - AST
Подробное объяснение двигателя V8 (3) — эволюция V8 с точки зрения байт-кода
Подробное объяснение движка V8 (4) - как выполняется байт-код
Подробное объяснение двигателя V8 (5) - встроенный кэш
Подробное объяснение двигателя V8 (6) - структура памяти
Подробное объяснение двигателя V8 (7) — механизм сбора мусора
Подробное объяснение движка V8 (8) - очередь сообщений
Подробное объяснение двигателя V8 (9) - функция сопрограммы и генератора