我有一个.NET2.0 C# web应用程序。它具有数量可变的大型初始开销对象,这些对象在多个请求之间共享,但不会分配给任何给定的用户。因此,我需要在一个查找结构中持久化它们。这些对象需要根据需要创建,而不是应用程序的生命周期所必需的,只需要它们的使用寿命。
再加一点。
内存泄漏的方法是一个简单的字典,内存安全的方法是一个弱引用支持的字典,但我的问题是GC太快了。实际上,这可能不是问题,因为对象的流量应该是这样的,即它们将保持存活,而不会被迫重新生成太多内容,但理想情况下,我希望它们也能缩减规模。
有没有一种我没有想到的中间解决方案,它可以让对象在一段时间X内对GC安全隐藏,但也允许在该时间结束时收集它们,最好是每次以类似于会话令牌的方式使用它们时,时间计数器都会被重置?
发布于 2009-03-09 17:43:48
我不确定为什么HttpRuntime cache不能在这里工作。插入到缓存中的项将在每次被触摸时被“更新”,从而使它们保持存活,直到不再需要它们;在此之后,它们将继续留在缓存中,直到它们过期(滑动或滚动时间)或由于内存压力而被迫退出。它们还可以在显式设置的绝对时间强制退出,而不考虑使用情况:
滚动时间:在系统时钟超过一定的滚动时间( DateTime
示例用法:
//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);发布于 2009-03-09 17:43:48
为什么不使用框架中的Cache对象,并为其设置一个可滑动的过期时间。比如说10分钟。如果它至少每10分钟使用一次,它将留在缓存中,如果超过10分钟,它将过期,GC将删除它。
例如:(我认为这是完整的语法
Cache.Add("myKey", MyLargeObject, null, DateTime.Now.AddMinutes(10), Cache.SlidingExpiration, CacheItemPriority.High)发布于 2009-03-09 17:45:41
这听起来像是你已经在描述自己的问题的解决方案;一种缓存结构,它在一段时间内保存强引用,但如果一段时间过去了,对象没有被“访问”,则将它们降级为弱引用。
https://stackoverflow.com/questions/627267
复制相似问题