这是与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中释放未使用的共享对象的最佳方法是什么?