2017-01-31 48 views
4

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

+0

[MemoryCache不符合配置中的内存限制]的可能重复(http://stackoverflow.com/questions/6895956/memorycache-does-not-obey-memory-limits-in-configuration) –

回答

2

请参阅MemoryCacheElement,如果您没有将值传递给NameValueCollection configin the constructor或者您使用默认实例,那么这将控制默认行为。

通过MemoryCacheElement的默认设置,它会每隔两分钟检查一次(但它的确会更快地执行the closer you are to the high pressure limit)。一旦进入timer's callback它将计算百分比来修剪掉MemoryCache,然后使用计算的百分比调用MemoryCache.Trim(Int32)

the percentage calculation中有一点需要注意,如果没有Gen 2垃圾收集发生,缓存不会尝试收缩自身。

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

如果您想模拟驱逐就叫

MemoryCache.Default.Trim(50); 

这就会收回一半的缓存从默认的缓存。