Когда яваскрипт нарушает обещания или объекты собирают мусор - PullRequest
0 голосов
/ 28 января 2019

Я тестировал promises и garbage collection и в соответствии с этой статьей , promise, как показано в приведенном ниже коде, должно получить garbage collected.Я использовал WeakMap для проверки, так как он не должен мешать ГХ.

var map = new WeakMap();
map.set(new Promise(function() {}), "test");

function doCheck() {
  console.log(map);
}

Я тестировал код выше в chrome, и на карте все еще была ссылка на обещание.Мое понимание класса WeakMap неверно?Если нет, то почему обещание не GC'ed?

1 Ответ

0 голосов
/ 28 января 2019

Большинство движков Javascript использует алгоритм Mark-and-sweep для проверки того, нужно ли собирать объект или нет.

Этот алгоритм предполагает знание набора объектов, называемых корнями (В JavaScript корнем является глобальный объект).Периодически сборщик мусора будет запускаться из этих корней, находить все объекты, на которые ссылаются эти корни, затем все объекты, на которые ссылаются эти, и т. Д. Начиная с корней, сборщик мусора будет находить все достижимые объекты и собирать все недопустимые объекты.достижимые объекты.

Кроме того, объект карты слабо удерживает ссылки на объекты.И нет никаких других ссылок на объект обещания, движок JS должен очистить объект обещания в следующем цикле сборки мусора.

Когда я в первый раз вызывал doCheck (), map имеет ссылку на обещание.Но когда я вызвал второй раз, он был пуст.

enter image description here

...