Понимание слабых карт

ECMAScript 6 представляет слабые карты, доступные в Node.JS v0.11.3 с --harmony флаг. Учтите следующее.

let weakMap = WeakMap();
let key = [];
let rubbish = 'fish cans';

weakMap.set(key, rubbish);
rubbish = 'empty bottle';

// Prints "fish cans"
console.log(weakMap.get(key));

У меня сложилось впечатление, что для слабых карт ссылка от ключа к значению является слабой, поэтому, если единственной ссылкой на значение является ключ, то к значению больше нельзя получить доступ.

Почему тогда ценность 'fish cans' все еще доступно и не мусор собрано? Переменная rubbish больше не ссылается на него, а ссылка от key в 'fish cans' является слабым, то есть несуществующим с точки зрения сборщика мусора. Что мне не хватает?

4 ответа

Решение

Слабая часть - это ключи, а не ценности. Из текущего проекта:

WeakMap предназначены для обеспечения механизма динамического связывания состояния с объектом таким образом, чтобы не "утекать" ресурсы памяти, если в отсутствие WeakMap объект в противном случае стал недоступным и подлежал возврату из-за ресурсов механизмами сборки мусора реализации.,

Допустим, у вас есть элемент DOM, и вы хотите связать с ним некоторые данные и использовать WeakMap для этого: weakMap.set(domElement, data);, Когда элемент DOM удаляется, удаляется и запись в слабой карте.

С другой стороны, вы не хотели бы, чтобы данные удалялись, пока существует элемент DOM, просто потому, что нет другой ссылки на него за пределами слабой карты.

Помимо этого 'fish cans' является примитивным типом и как таковой не подлежит сборке мусора.

Почему тогда ценность 'fish cans' все еще доступно и не мусор собрано? Переменная мусор больше не ссылается на нее, а ссылка от ключа к 'fish cans' является слабым, то есть несуществующим с точки зрения сборщика мусора. Что мне не хватает?

Переменная rubbish никогда не было того, на что нужно было ссылаться. Связь (ссылка) от ключа к значению все еще существует, пока ключ не собран. Слабая ссылка, которую GC не может увидеть, это ссылка с карты на пару ключ / значение (которая делает карту перечислимой). Все же ваш key все еще существует, и вы можете получить каждое значение, которое вы сохранили для него на карте:

var map = WeakMap(),
    key = [];

map.set(key, 'fish cans');
console.log(map.get(key)); // Prints "fish cans"

Чтобы продемонстрировать слабость, вы должны использовать следующее:

var map = WeakMap(),
    key = [];

map.set(key, 'fish cans');
// map.size == 1
key = null;
// map.size == 0 - the fish cans got garbage-collected together with the key
map.get(???) // impossible now

Я добавляю этот ответ к адресу / уточняю следующий пункт:

Начальное значение переменной 'rubbishникогда не мутировал; все, что вы сделали на rubbish = 'empty bottle'; должен был связать псевдоним rubbish к другому значению. Следовательно даже после rubbish = 'empty bottle'; был выполнен, weakMap вход с ключомkey'все еще имеет значение, связанное с ним, которое ссылается на первоначальное значение rubbish,

Затем, чтобы значение потеряло ассоциацию с ключом, вы должны изменить значение ключевой переменной (как уже отмечалось в ответе @Bergi).

Обратите внимание, что key.push("whatever"); не составляет изменения. Тем не мение, key = []; повторяется снова будет делать так же, как key = null;, Как правило, любое переназначение приведет к желаемому изменению.

Я тоже пытаюсь это понять. Я думаю, что в абзаце сказано:

var key={a:1};
var wm=new WeakMap();


wm.set(key,"value");
wm.get(key); //you can get "value";

key=undefined;
console.log(wm.get(key));//error.original key have no longer existed. so "value" is not longer existed as well.

Из-за того, что у WeakMap нет возможности получить ключи, у вас больше нет возможности получить это "значение".

если мы используем Map(), из-за has keys(), records (), хотя переменная key потеряла ссылку, "value" все равно можно получить.

var key={a:1};
var m=new Map();


m.set(key,"value");
console.log(m.keys().next());; //you can get "value";

key=undefined;
console.log(m.get(m.keys().next().value));//you can get "value";

Заключение:

Если ключ объекта WeakMap потерял свою ссылку, этот ключ и значение также будут собраны сборщиком мусора (потому что логически недоступны). Этот способ может предотвратить утечку памяти.

Если ключ объекта Map потерял свою ссылку, этот ключ и значение будут оставаться доступными до тех пор, пока вы не удалите или не очистите их. Таким образом, вы должны знать об утечке памяти во время разработки

Просто найдите ссылку о понимании слабой карты и ее вариантов использования: http://ilikekillnerds.com/2015/02/what-are-weakmaps-in-es6/

Другие вопросы по тегам