Узнайте об алгоритме сборки мусора javascript

внешний интерфейс алгоритм JavaScript V8
Узнайте об алгоритме сборки мусора javascript

Механизм сборки мусора javascript, который мы обычно понимаем, остается на поверхности, «освободит память переменных, на которые нет ссылок». Недавно я читал книгу «node.js простыми словами», я подробно узнал об алгоритме сборки мусора v8, и записал некоторые учебные заметки.

Стук по доске: алгоритм сборки мусора движка v8

Стратегия сборки мусора V8 в основном основана на механизме сборки мусора поколений.В современном алгоритме сборки мусора сбор памяти памяти делится на разные поколения в соответствии со временем выживания объекта, а затем используется более эффективный алгоритм. обращено к памяти разных поколений. В V8 память в основном делится на два поколения: новое поколение и старое поколение. Объекты в новом поколении — это объекты с более коротким временем выживания, а объекты в старом поколении — это объекты с более длительным временем выживания или находящиеся в памяти.

Алгоритм очистки

На основе генерации объекты в новом поколении в основном представляют собой мусор, собранный с помощью алгоритма Scavenge.В конкретной реализации Scavenge в основном используется алгоритм Чейни.

Алгоритм Чейни — это алгоритм сборки мусора, реализованный посредством репликации. Он делит память кучи на две части, и каждая часть пространства называется полупространством. Из этих двух полупространств только одно используется, а другое не используется. Используемое полупространство называется Из пространства, а пространство в неактивном состоянии называется В пространство. Когда мы размещаем объект, мы сначала делаем это в пространстве From. Когда сборка мусора начнется, живые объекты в пространстве From будут проверены, эти живые объекты будут скопированы в пространство To, а пространство, занятое неживыми объектами, будет освобождено. После завершения копирования роли From space и To space меняются местами. Короче говоря, в процессе сборки мусора это копирование живых объектов между двумя полупространствами.

Mark-Sweep & Mark-Compact

Алгоритм Scavenge очень подходит для нового поколения с коротким жизненным циклом, жертвуя пространством в пользу времени.Однако, когда объект был скопирован много раз, когда жизненный цикл длинный или места To недостаточно, объект будет выделен к старому поколению.В поколении необходимо использовать новый алгоритм для сборки мусора.

Mark-Sweep не делит пространство памяти на две половины, поэтому не происходит потери половины пространства. В отличие от Scavenge, который копирует живые объекты, Mark-Sweep обходит все объекты в куче на этапе маркировки и помечает живые объекты, а на последующем этапе очистки очищает только неотмеченные объекты. Как видно, в Scavenge копируются только живые объекты, в то время как Mark-Sweep очищает только мертвые объекты.

После того, как Mark-Sweep выполнит очистку и повторное использование меток, пространство памяти будет выглядеть прерывистым. Такая фрагментация памяти вызовет проблемы при последующем выделении памяти, потому что очень вероятно, что нужно выделить большой объект, в это время все фрагментированное пространство не может завершить это выделение, и сборка мусора будет запущена заранее, и эта коллекция не нужна. После того, как объект Mark-Compact помечен как мертвый, в процессе сортировки переместите живой объект в один конец.После завершения перемещения память за границей непосредственно очищается.

Инкрементные маркеры

Чтобы избежать несоответствия между логикой приложения JavaScript и тем, что видит сборщик мусора, все три основных алгоритма сборки мусора должны приостановить логику приложения, а затем возобновить выполнение логики приложения после выполнения сборки мусора. поведение называется «Полная пауза», длительная сборка мусора «полная пауза» заставит пользователей чувствовать очевидные зависания, что повлияет на опыт. Взяв в качестве примера 1,5 ГБ кучи памяти для сборки мусора, V8 требуется более 50 миллисекунд для выполнения небольшой сборки мусора и даже более 1 секунды для выполнения неинкрементной сборки мусора. Это время, в течение которого сборка мусора приводит к приостановке выполнения потоков JavaScript. Затраченное на это время производительность и скорость отклика приложения резко упадут.

Чтобы сократить время паузы, вызванное сборкой мусора с полной кучей, V8 начинается с фазы маркировки и изменяет действие, которое изначально должно было быть приостановлено за один раз, на инкрементную маркировку, то есть разбитую на множество небольших «шагов». После каждого «шага» позволяйте логике приложения JavaScript выполняться в течение короткого времени, а сборка мусора и логика приложения выполняются поочередно, пока фаза маркировки не будет завершена.

Расширенное чтение

Учебное пособие по утечке памяти в JavaScript

Интенсивное чтение «Введение в Node.js»

«Введение в Node.js» PDF

Адрес для скачивания ментальной карты