在javascript中释放未使用的共享对象的最佳方法是什么?

时间:2019-04-19 10:33:00

标签: javascript architecture software-design

这是与Java语言能力紧密相关的软件架构师问题。我有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中没有WeakReference。还是我错过了什么? 注意:我了解WeakMap,对此似乎毫无用处,因为它仅支持Key的“ Weak”而不是Value:(new WeakMap()).set(1,{})引发异常。 WeakMap details here

C ++解决方案

在C ++中,内存管理始终是“手工”进行的。 我将引用计数用于SharedCachedItem(Boost example),并结合RAII原则来管理此“引用持有人”对象。

在Javascript中,无法使用RAII。还是我错过了什么?

最后的C ++样式解决方案

使用引用计数并在完成使用后手动调用.release()。这就是我现在要实现的。 该解决方案的问题在于,很容易忘记“ .release()”,特别是对于try..catch more info why

中有异常的情况

所以,问题是

在javascript中释放未使用的共享对象的最佳方法是什么?

0 个答案:

没有答案