Каков наилучший способ освободить неиспользуемые общие объекты в JavaScript? - PullRequest
2 голосов
/ 19 апреля 2019

Это вопрос разработчика программного обеспечения, тесно связанный с возможностями языка 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?

...