Механизм сборки мусора 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