我有一个.NET2.0 C#网络应用程序。它具有可变数量的大型初始化昂贵的对象,这些对象在多个请求之间共享但不与任何给定用户进行会话。因此,我需要将它们保存在查找结构中。这些对象需要根据需要创建,并不是应用程序生命周期所必需的,只是它们使用的生命周期。
加一点。
执行此操作的内存泄漏方式是一个简单的字典,执行此操作的内存安全方法是一个弱引用支持字典,但我遇到的问题是GC太快死了。实际上这可能不是一个问题,因为对象的流量应该是这样的,它们将保持活着而不会被迫再生太多,但理想情况下我希望它们也能缩小。
是否存在某种中间解决方案,我没有考虑哪种方法可以将对象安全地隐藏在GC中一段时间X,但也允许在该时间结束时收集它们,最好是每次以与会话令牌类似的方式使用时间计数器时,它会被重置?
答案 0 :(得分:5)
我不确定为什么HttpRuntime cache在这里不起作用。插入缓存的项目每次被触摸时都会被“更新”,从而使它们保持活力直到它们不再需要为止;之后,他们将继续留在缓存中,直到它们到期(滑动或滚动时间)或由于记忆压力而被迫退出。无论使用情况如何,它们也可以在明确设定的绝对时间强制退出:
绝对时间:系统时钟超过某个DateTime后强制退出项目
滑动(滚动)时间:每次触摸某个项目时,其重新开始倒计时。倒计时的持续时间是滑动时间(例如,5分钟)。
使用示例:
//adds itemObject to cache under name "UniqueItemKey"
//set to expire 5 minutes after last touched
HttpRuntime.Cache.Add("UniqueItemKey",
itemObject,
null,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 5, 0),
CacheItemPriority.Normal,
null);
答案 1 :(得分:1)
为什么不使用框架中的Cache对象并在其上设置滑动过期。说10分钟。如果它每10分钟至少使用一次,它将保留在缓存中,如果10分钟过去它将过期,GC将删除它。
一个例子:(我相信这是完整的语法
Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High)
答案 2 :(得分:0)
听起来你已经在描述解决自己问题的方法;一种缓存结构,它在一段时间内保存强引用,但如果在没有对象被“访问”的情况下经过一段时间,则将它们降级为弱引用。
答案 3 :(得分:0)
关键部分是“使用寿命”。你是如何定义的?如果您能够以不需要了解未来的方式精确定义它,其余的可能很容易。