点网内存缓存驱逐

Posted

技术标签:

【中文标题】点网内存缓存驱逐【英文标题】:Dot Net MemoryCache Eviction 【发布时间】:2017-06-17 12:10:27 【问题描述】:

dot net 的 MemoryCache 驱逐发生在什么时候?如何在控制台应用程序中模拟驱逐?每当我尝试将对象添加到内存缓存直到发生驱逐时,我都会得到 OutofMemoryException。

【问题讨论】:

MemoryCache does not obey memory limits in configuration的可能重复 【参考方案1】:

请参阅MemoryCacheElement,如果您不将值传递给NameValueCollection config in the constructor 或使用默认实例,则它控制默认行为。

查看MemoryCacheElement 的默认设置,它每两分钟检查一次(但它确实运行得更快the closer you are to the high pressure limit)。一旦进入timer's callback,它就会计算出从内存缓存中删除的百分比,然后使用计算出的百分比调用MemoryCache.Trim(Int32)

在the percentage calculation 中需要注意的一点是,如果没有发生第 2 代垃圾回收,缓存不会尝试自行收缩。

很有可能您的测试控制台程序运行方式在第 2 代收集发生之前耗尽了所有内存,或者仍处于最初的两分钟慢速模式以在清除项目之前检查内存压力出去。

如果您想模拟驱逐,只需调用

MemoryCache.Default.Trim(50);

这将从默认缓存中清除一半缓存。

【讨论】:

以上是关于点网内存缓存驱逐的主要内容,如果未能解决你的问题,请参考以下文章

Redis 上的哈希缓存驱逐

如何实现线程安全的 LRU 缓存驱逐?

web技术分享| LRU 缓存淘汰算法

apollo-cache-inmemory 的驱逐规则是啥?

Spring Cache:驱逐多个缓存

测量缓存行利用率