我正在尝试弄清楚如何使用MemoryCache来避免内存不足异常。我来自ASP.Net背景,其中缓存管理自己的内存使用情况,因此我期望MemoryCache也会这样做。但实际上并非如此,就像我制作的下面的测试程序所示:
class Program
{
static void Main(string[] args)
{
var cache = new MemoryCache("Cache");
for (int i = 0; i < 100000; i++)
{
AddToCache(cache, i);
}
Console.ReadLine();
}
private static void AddToCache(MemoryCache cache, int i)
{
var key = "File:" + i;
var contents = System.IO.File.ReadAllBytes("File.txt");
var policy = new CacheItemPolicy
{
SlidingExpiration = TimeSpan.FromHours(12)
};
policy.ChangeMonitors.Add(
new HostFileChangeMonitor(
new[] { Path.GetFullPath("File.txt") }
.ToList()));
cache.Add(key, contents, policy);
Console.Clear();
Console.Write(i);
}
}
在使用大约2GB内存(任意CPU)或消耗所有机器物理内存(x64)(16GB)后,以上代码会抛出内存不足异常。
如果我删除cache.Add部分,程序将不会抛出任何异常。如果我在每次cache添加后包含对cache.Trim(5)的调用,我看到它释放了一些内存,并且在任何给定时间保留了大约150个对象在缓存中(从cache.GetCount()获取)。
调用cache.Trim是我的程序的责任吗?如果是,那么应该在什么时候调用它(例如,我的程序如何知道内存正在变满)?如何计算百分比参数?
注意:我计划在长时间运行的Windows服务中使用MemoryCache,因此它具有适当的内存管理至关重要。