.NET MemoryCache中的对象被意外逐出

时间:2015-03-12 14:11:42

标签: asp.net memorycache evict

我在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()函数的内部实现,当代码被驱逐时使用。因此,计算并不容易理解,也许有人知道它是如何工作的,并且可以为我指出这一点。

如果有人能够对此有所了解,那就太好了。

非常感谢您提前和对于这篇很长的帖子感到抱歉;)

(顺便说一下。这是我的第一篇文章,所以任何关于如何改进我的问题的建议都受到高度赞赏)

0 个答案:

没有答案