Это вопрос разработчика программного обеспечения, тесно связанный с возможностями языка Javascript.У меня есть фон C ++, и теперь я пытаюсь создать какое-то решение среднего размера с кэшированием.
Вот некоторый псевдокод в машинописи, иллюстрирующий проблему:
class CacheHolder {
cacheItems: Map<number, SharedCachedItem>
get(id:number): SharedCachedItem {
let item = cacheItems.get(id);
if(item)
return item;
item = new SharedCachedItem();
// ... here loads item somehow ...
cacheItems.set(id, item);
return item;
}
}
Я хочу SharedCachedItemбыть выпущенным, когда он не используется (то есть не упоминается нигде, кроме CacheHolder).CacheHolder.cacheItems содержит постоянные ссылки на все SharedCachedItem, это предотвращает сбор мусора в Javascript, поэтому я вынужден вручную реализовать некоторое управление памятью.
Решение на Java
Легко и просто:
Map<number, WeakReference<SharedCachedItem> >
К сожалению, в Javascript нет слабых ссылок.Или я что-то упустил? Обратите внимание: я знаю о WeakMap, и он кажется бесполезным для этого, потому что он поддерживает только «Weak» для Key, а не для Value: (new WeakMap()).set(1,{})
выдает исключение. Детали WeakMap здесь
Решение в C ++
В C ++ управление памятью всегда выполняется «вручную».Я бы использовал подсчет ссылок для SharedCachedItem ( Boost example ) для объединения с принципом RAII для управления объектами "держателя ссылок".
К сожалению RAIIневозможно в Javascript.Или я что-то упустил?
Последнее решение в стиле C ++
Использовать подсчет ссылок с ручным вызовом .release ()когда закончишь его использовать.Это то, что я собираюсь реализовать сейчас.Проблема с этим решением заключается в том, что ".release ()" можно очень легко забыть, особенно для случаев с исключениями в try..catch . Подробнее, почему
Итак, вопрос:
Каков наилучший способ освобождения неиспользуемых общих объектов в javascript?