предисловие
js имеет механизм автоматической сборки мусора, другими словами, среда выполнения управляет памятью, используемой во время выполнения кода.
Принцип сборки мусора js
Среда выполнения найдет те переменные, которые больше не используются, а затем освободит занимаемую ими память.
js стратегия сборки мусора
пометить как очищенный
Когда переменная входит в среду, переменная помечается как «входящая в среду», а когда переменная выходит из среды, она помечается как «выходящая из среды».
Способ пометки переменных зависит от конкретной реализации, например, вы можете использовать список переменных «входящий в среду» и список переменных «выходящий из среды», чтобы отслеживать, какая переменная изменилась.
Браузеры, которые использовали удаление разметки, включают IE, Firefox и chrome.
подсчет ссылок
Это менее распространенная стратегия сборки мусора, которая отслеживает количество ссылок на каждое значение.
Когда объявлена переменная a и ей присвоено значение ссылочного типа ({name:'cc'}), количество ссылок на это значение равно 1. Если a ({name:'cc'}) присвоено переменной Для другой переменной b количество ссылок на значение увеличивается на 1. И наоборот, если a присваивается {name:'xx'}, количество ссылок на значение {name:'cc'} уменьшается на 1. Когда количество ссылок на значение {name:'cc'} становится равным 0, это означает, что нет способа получить доступ к значению {name:'cc'}, поэтому занимаемое им пространство памяти может быть освобождено. Таким образом, при работе сборщика мусора пространство памяти, занятое значением {name:'cc'}, будет освобождено.
Этот подход использовался в Netscape Navigator 3.0, но имеет серьезную проблему: циклические ссылки.
function circleReferenceProbem(){
let objectA = new Object()
let objectB = new Object()
objectA.someOtherObject = objectB
objectB.anotherObject = objectA
}
После выполнения этой функции, поскольку счетчик ссылок этих двух ссылочных значений никогда не будет равен 0, занимаемое ими пространство памяти никогда не будет освобождено сборщиком мусора.
производительность сборщика мусора js
Потому что сборщик мусора js выполняет сборку мусора каждый второй цикл.
Если объем памяти, выделенный для переменной, невелик, то у сборщика мусора не так много работы по сбору. Однако, когда рабочая нагрузка сборщика мусора слишком велика, очень вероятно, что ситуация застрянет.
Предложения по управлению памятью в js
- Минимизируйте использование глобальных переменных
- По возможности очищайте вручную ссылки на переменные
Спасибо за прочтение!
Если вам нужно добавить WeChat для общения, вы можете оставить сообщение!