我在ASP.NET应用程序中使用.NET MemoryCache有一些奇怪的行为。问题是,对象将在查看分钟后被驱逐,似乎没有理由。内存限制在web.config中设置:
<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name="Default"
cacheMemoryLimitMegabytes="1500"
physicalMemoryLimitPercentage="18"
pollingInterval="00:02:00" />
</namedCaches>
</memoryCache>
</system.runtime.caching>
我的开发机器有8 GB的ram,w3wp.exe进程使用大约0.5 GB。应用程序运行时,机器上仍然可以使用2 GB(在visual studio,webbrowsers等旁边)
每个条目都添加了RemovedCallBack方法,以便为每次删除生成日志条目,特别是对于驱逐:
private static void CachedItemRemovedCallback(CacheEntryRemovedArguments arguments)
{
LogCurrentCacheDelta(arguments.CacheItem, true);
if (arguments.RemovedReason == CacheEntryRemovedReason.Evicted)
{
Sitecore.Diagnostics.Log.Warn(
string.Format(
"Cache Item Evicted (cacheMemoryLimitMegabytes: {0}) - Key: {1}, Value: {2}",
FlightServiceCache.CacheMemoryLimit,
arguments.CacheItem.Key,
arguments.CacheItem.Value),
FlightServiceCache);
}
}
还计算了一个计算当前使用大小的计数器。我使用二进制序列化来估计内存中对象的大小。目前,第一次驱逐发生,大约120个对象在缓存中,使用的内存大约为6兆字节。根据我的理解,这绝不是从缓存中逐出条目的原因。但它一次又一次地发生,经过几天的调查,我仍然不确定为什么会发生这种情况。
我还看了一下.NET框架源代码中trim()函数的内部实现,当代码被驱逐时使用。因此,计算并不容易理解,也许有人知道它是如何工作的,并且可以为我指出这一点。
如果有人能够对此有所了解,那就太好了。
非常感谢您提前和对于这篇很长的帖子感到抱歉;)
(顺便说一下。这是我的第一篇文章,所以任何关于如何改进我的问题的建议都受到高度赞赏)