0

我在 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 的内存,而 w3wp.exe 进程使用了​​大约 0.5 GB。应用程序运行时,机器上仍有 2 GB 可用空间(除了 Visual Studio、Web 浏览器等)

已将 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() 函数的内部实现。因此所做的计算并不容易理解,也许有人知道它是如何工作的并且可以为我指出这一点。

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

非常感谢你,很抱歉发了这么长的帖子;)

(顺便说一句。这是我的第一篇文章,因此非常感谢任何有关如何改进我的问题的建议)

4

0 回答 0