- Оригинальный адрес:Understanding JavaScript Memory Management using Garbage Collection
- Оригинальный автор:Kewal Kothari
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:wuzhengyan2015
- Корректор:GpingFeng, Qiuk17
Основной целью управления памятью является динамически распределить память для системы при необходимости, а затем выпустить память объектов, которые больше не используются. Языки, такие как C и C ++, имеют базовые функции распределения памяти, такие какmalloc(), в то время как некоторые высокоуровневые компьютерные архитектуры (например, JavaScript) включают сборщик мусора для выполнения этой работы. Он отслеживает выделение памяти и определяет, не используется ли эта выделенная память, и если да, то автоматически освобождает ее. Но этот алгоритм не может полностью решить, нужна ли еще память. Поэтому для программистов очень важно понимать и решать, требует ли конкретная часть кода памяти. Давайте разберемся, как работает сборка мусора в JavaScript:
вывоз мусора
Движок JavaScript ищет, в основном сборщик мусора не может получить доступ к объекту в памяти, удаляется. Здесь я хотел бы объяснить два вида алгоритма сборки мусора, а именно:
- сборка мусора с подсчетом ссылок
- Алгоритм развертки пометки
сборка мусора с подсчетом ссылок
Это простой алгоритм сборки мусора. Этот алгоритм ищет объекты, на которые нет ссылок. Если на объект нет ссылки, то объект может быть удален сборщиком мусора.
var obj1 = {
property1: {
subproperty1: 20
}
};
Как показано в приведенном выше примере, давайте создадим объект, чтобы понять этот алгоритм. здесьobj1относится к объекту, гдеproperty1Свойства также ссылаются на объект. из-заobj1Имеет ссылку на объект, поэтому этот объект не будет удален сборщиком мусора.
var obj2 = obj1;
obj1 = "some random text"
Сейчас,obj2также цитируетсяobj1тот же объект, на который ссылаются, но позжеobj1был обновлен до"some random text"Это ведет кobj2имеет уникальную ссылку на объект.
var obj_property1 = obj2.property1;
Сейчасobj_property1направлениеobj2.property1, который ссылается на объект. Таким образом, объект имеет две ссылки, подобные этой:
- так как
obj2свойства - в переменной
obj_property1середина
obj2 = "some random text"
путем обновления до"some random text"отменитьobj2Ссылка на объект. Таким образом, предыдущий объект, кажется, больше не упоминается, поэтому он может быть собран мусором. Однако из-заobj_property1имеютobj2.property1ссылка, так что это не будет сборщиком мусора.
obj_property1 = null;
когда мы ставимobj_property1Цитата удалена, теперь оригиналobj1На указанный объект больше не ссылаются. Так что теперь можно собирать мусор.
Где этот алгоритм дает сбой?
function example() {
var obj1 = {
property1 : {
subproperty1: 20
}
};
var obj2 = obj1.property1;
obj2.property1 = obj1;
return 'some random text'
}
example();
Этот алгоритм подсчета ссылок не удаляется из памяти после вызова функцииobj1а такжеobj2, так как оба объекта ссылаются друг на друга.
Алгоритм развертки пометки
Этот алгоритм находит недоступные объекты, начиная с корня, который является глобальным объектом JavaScript. Этот алгоритм преодолевает ограничения алгоритмов подсчета ссылок. Объекты без ссылок недоступны, но не наоборот.
var obj1 = {
property1: 35
}
Как показано выше, мы можем видеть созданный объект.obj1Как получить доступ с ROOT.
obj1 = null
Теперь, когда мы будемobj1Значение установлено наnull, объект недоступен из корня, поэтому он может быть удален сборщиком мусора.
Алгоритм начинается с корня и перебирает все остальные объекты, помечая их. Далее он обходит пройденные объекты и отмечает их. Этот процесс будет повторяться до тех пор, пока все пройденные узлы не будут иметь дочерних элементов и проходимых путей. Все доступные объекты теперь игнорируются сборщиком мусора, потому что они помечаются по мере их обхода. Таким образом, все объекты без тегов заведомо недоступны из корневого узла, а это значит, что они могут быть удалены сборщиком мусора и освобождением памяти позже путем удаления этих объектов. Попробуем понять это на следующем примере:
Как показано выше, так выглядит структура объекта. Мы можем замечать объекты, недоступные из корня, но давайте попробуем понять, как в этом случае работает алгоритм пометки-зачистки.
Алгоритм отмечает пройденные объекты от корня. На картинке выше мы можем заметить зеленый круг, отмеченный на объекте. Таким образом, он идентифицирует объект как доступный из корня.
Доступ к неотмеченным объектам из корня невозможен. Таким образом, они могут быть собраны с мусором.
ограничение
Объект должен быть явно установлен как недоступный.
С 2012 года движки JavaScript используют этот алгоритм вместо сборки мусора с подсчетом ссылок.
Спасибо за прочтение.
Дальнейшее чтение:
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковИзменить переводы и PR, а также можно получить соответствующие призовые баллы. Статьи начинаяПостоянная ссылка на эту статьюТо есть эта статья является ссылкой MarkDown на Github.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,товар,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.