相当于.net中的SoftReference?

时间:2009-03-10 20:04:25

标签: .net garbage-collection weak-references soft-references

我熟悉WeakReference,但我正在寻找一种仅在内存不足时才清除 的引用类型,而不仅仅是每次gc运行时(就像Java的{ {1}})。我正在寻找一种实现内存敏感缓存的方法。

5 个答案:

答案 0 :(得分:2)

也许ASP.NET Cache类(System.Web.Caching.Cache)可能有助于实现您的目标?如果内存不足,它会自动删除对象:

Here's an article,展示了如何在Windows窗体应用程序中使用Cache类。

答案 1 :(得分:2)

除了ASP.NET缓存之外,Microsoft模式和实践组还有缓存应用程序块。

http://msdn.microsoft.com/en-us/library/cc309502.aspx

答案 2 :(得分:2)

ASP.NET缓存为您提供了所需的内存敏感行为,缺点是所有内容都需要唯一的密钥。但是,您应该能够将WeakReference保存到已放置在ASP.NET缓存中的对象。缓存的强引用将使GC保持不变,直到缓存决定需要清除它以释放内存。 WeakReference使您无需使用缓存键进行查找即可访问该对象。

Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;

...

if ( weakRef.IsAlive )
{
    Foo strongRef = weakRef.Target as Foo;
}

您可以通过沿

行扩展WeakReference来创建SoftReference类
class SoftReference : WeakReference
{
    public SoftReference( object target ) : base( target )
    {
        HttpRuntime.Cache[Guid.NewGuid().ToString()] = target; 
    }
}

您还需要覆盖Target上的setter,以确保任何新目标都进入缓存。

答案 3 :(得分:1)

虽然SoftReference似乎是实现内存缓存的一种方便方法,但它需要Java运行时稍微任意确定保持对象的好处是否超过了存储它的成本。不幸的是,运行时关于保持对象的实际成本的信息有限(请记住,实际成本可能包括应用程序的内存使用对其他应用程序的影响),实际上没有关于保持对象的好处的信息

如果保持一个对象是值得的,即使没有外部强引用存在,缓存应该保持对它的强引用(至少只要它看起来值得)。如果将对象保留在缓存中的好处只会在外部引用存在的情况下延长(例如,因为生成实例很便宜,但是拥有两个包含相同数据的逻辑实体使用相同的实例来保存它们将有助于这些实体之间的比较),应该使用WeakReference

顺便说一句,如果我有我的druthers,.net将支持我在任何平台上都没有看到的另一种引用:“对别人感兴趣”的引用,它将与{{ {1}}。 “对他人感兴趣”的引用可以用作强引用,但如果对其目标的唯一强引用“对其他人感兴趣”,则适当配置的WeakReference将无效。在弱事件处理程序重复生成对其目标的强引用的情况下,这样的概念可以在使用并发GC时提高效率。如果没有人真正对事件处理程序对其目标做什么感兴趣,那么处理程序可以取消订阅是理想的。

答案 4 :(得分:0)

不,没有相应的。 WeakReference无法完成这项工作的原因是什么?

以下是与您类似的问题:

Why doesn't .NET have a SoftReference as well as a WeakReference, like Java?