我在 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() 函数的内部实现。因此所做的计算并不容易理解,也许有人知道它是如何工作的并且可以为我指出这一点。
如果有人能对此有所了解,那就太好了。
非常感谢你,很抱歉发了这么长的帖子;)
(顺便说一句。这是我的第一篇文章,因此非常感谢任何有关如何改进我的问题的建议)