在javascript中释放未使用的共享对象的最佳方法是什么?
这是一个与Javascript语言能力密切相关的软件架构师问题。我有C++背景,现在我尝试用缓存来构造一些中等大小的解决方案。 下面是typescript中的一些伪代码,说明了问题:在javascript中释放未使用的共享对象的最佳方法是什么?,javascript,architecture,software-design,Javascript,Architecture,Software Design,这是一个与Javascript语言能力密切相关的软件架构师问题。我有C++背景,现在我尝试用缓存来构造一些中等大小的解决方案。 下面是typescript中的一些伪代码,说明了问题: class CacheHolder { cacheItems: Map<number, SharedCachedItem> get(id:number): SharedCachedItem { let item = cacheItems.get(id);
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;
}
}
类缓存持有者{
缓存项:地图
获取(id:编号):SharedCachedItem{
let item=cacheItems.get(id);
如果(项目)
退货项目;
item=新的SharedCachedItem();
//…这里以某种方式加载项目。。。
cacheItems.set(id,item);
退货项目;
}
}
我希望SharedCachedItem在未使用时被释放(即,除了CacheHolder之外,其他任何地方都没有引用)。
CacheHolder.cacheItems持有对所有SharedCachedItem的永久引用,这防止Javascript对它们进行垃圾收集,因此我被迫手动实现一些内存管理
Java解决方案
简单明了:
Map<number, WeakReference<SharedCachedItem> >
Map
遗憾的是,Javascript中没有弱引用。还是我遗漏了什么?
注意:我知道WeakMap,它似乎对此没有用处,因为它只支持键的“弱”,而不支持值:(new WeakMap())。set(1,{})
抛出异常
C++中的解决方案
《C++内存管理》总是由手工制作的。
我将使用SharedCachedItem()的引用计数与RAII原则一起管理这个“引用持有者”对象
遗憾的是,RAII在Javascript中是不可能的。还是我遗漏了什么
<强>最后的C++风格解决方案<强> < /P> 使用引用计数并在使用完成后手动调用.release()。这就是我现在要实现的。 此解决方案的问题是“.release()”很容易被忘记,特别是对于try..catch中出现异常的情况
因此,问题是:在javascript中释放未使用的共享对象的最佳方法是什么?和@ponury kostek No。您甚至无法将数字键设置到WeakMap中。试试这个:让m=newweakmap();m、 集合(1,{});