我有一个.NET2.0 C#web-app.它具有可变数量的大型初始化昂贵的对象,这些对象在多个请求之间共享,但不与任何给定用户进行会话.因此,我需要将它们保存在查找结构中.这些对象需要根据需要创建,并不是应用程序生命周期所必需的,只是它们使用的生命周期.
再加上一点.
内存泄漏方式是一个简单的字典,这样做的内存安全方法是一个弱引用支持字典,但我遇到的问题是GC太快死了.实际上这可能不是一个问题,因为对象的流量应该是这样的,它们将保持活着而不会被迫再生太多,但理想情况下我希望它们也能缩小.
是否存在某种中间解决方案,我没有考虑哪种方法可以将对象安全地隐藏在GC中一段时间X,但也允许在那段时间结束时收集它们,最好是在那个时间计数器每次以与会话令牌类似的方式使用时都会重置?
我不确定为什么HttpRuntime缓存在这里不起作用.插入缓存的项目每次被触摸时都会被"更新",从而使它们保持活力直到它们不再需要为止; 之后,他们将继续留在缓存中,直到它们到期(滑动或滚动时间)或由于记忆压力而被迫退出.无论使用情况如何,它们也可以在明确设置的绝对时间强制退出:
绝对时间:系统时钟超过某个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);