我熟悉WeakReference
,但我正在寻找一种只在内存不足时才清除的引用类型,而不是每次垃圾回收运行时都清除(就像Java的SoftReference
)。 我正在寻找一种实现内存敏感缓存的方法。
我熟悉WeakReference
,但我正在寻找一种只在内存不足时才清除的引用类型,而不是每次垃圾回收运行时都清除(就像Java的SoftReference
)。 我正在寻找一种实现内存敏感缓存的方法。
Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;
...
if ( weakRef.IsAlive )
{
Foo strongRef = weakRef.Target as Foo;
}
class SoftReference : WeakReference
{
public SoftReference( object target ) : base( target )
{
HttpRuntime.Cache[Guid.NewGuid().ToString()] = target;
}
}
您还需要重写Target的setter方法,以确保任何新的目标都进入缓存。
这是一篇文章,展示了如何在 Windows 窗体应用程序中使用缓存类。
虽然SoftReference
可能看起来是实现内存缓存的方便方式,但它需要Java运行时对是否保留对象进行某种程度的任意决定,以确定保留对象的好处是否超过存储它的成本。不幸的是,运行时对于保留对象的真实成本有限的了解(请记住,真实成本可能包括应用程序的内存使用对其他应用程序的影响),并且几乎没有关于保留对象好处的信息。
如果即使在没有外部强引用的情况下保留对象仍然值得,缓存应该保持对它的强引用(至少在它似乎值得的时间内)。如果仅当外部引用存在时从将对象保留在缓存中获得好处时(例如,因为生成实例很便宜,但具有相同数据的两个逻辑实体使用相同的实例来保存它们将有助于这些实体之间的比较),则应使用WeakReference
。
WeakReference
类型一起使用。 “对其他人有兴趣”的引用可以被用作强引用,但是如果指向其目标的唯一强引用是“对其他人有兴趣”的引用,则适当配置的WeakReference
将无效。这样的概念可以在使用并发GC时提高效率,在弱事件处理程序反复生成对其目标的强引用的情况下。如果没有人真正关心事件处理程序正在执行什么操作,那么最好让处理程序取消订阅。