最佳答案
我在和。NET 4.0 < strong > Memory Cache 类,并试图限制最大缓存大小,但在我的测试中,似乎缓存实际上没有遵守这些限制。
我使用的设置,根据 MSDN,应该限制缓存大小:
- 缓存记忆限制兆字节 : 对象实例可以增长到的最大内存大小,以兆字节为单位。”
- “缓存可以使用的物理内存百分比,表示为从1到100的整数值。默认值为零,表示 记忆缓存实例根据计算机上安装的内存量管理自己的内存 < b > 1 < sup > 1.这并不完全正确——任何低于4的值都被忽略并替换为4。
我理解这些值是近似值,而不是硬限制,因为每 x 秒触发一次清除缓存的线程,并且还取决于轮询间隔和其他未记录的变量。然而,即使考虑到这些差异,当第一个条目在同时设置 缓存记忆限制兆字节和 物理内存限制百分比或在测试应用程序中单独设置后被从缓存中删除时,我还是会看到高度不一致的缓存大小。为了确保每个测试运行10次并计算平均值。
这些是在32位 Windows7 PC 机上测试下面的示例代码的结果,该机有3GB 内存。缓存的大小取决于每次测试中对 缓存移除()的第一次调用。(我知道缓存的实际大小会比这个大)
MemLimitMB MemLimitPct AVG Cache MB on first expiry
1 NA 84
2 NA 84
3 NA 84
6 NA 84
NA 1 84
NA 4 84
NA 10 84
10 20 81
10 30 81
10 39 82
10 40 79
10 49 146
10 50 152
10 60 212
10 70 332
10 80 429
10 100 535
100 39 81
500 39 79
900 39 83
1900 39 84
900 41 81
900 46 84
900 49 1.8 GB approx. in task manager no mem errros
200 49 156
100 49 153
2000 60 214
5 60 78
6 60 76
7 100 82
10 100 541
以下是测试应用程序:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Runtime.Caching;
using System.Text;
namespace FinalCacheTest
{
internal class Cache
{
private Object Statlock = new object();
private int ItemCount;
private long size;
private MemoryCache MemCache;
private CacheItemPolicy CIPOL = new CacheItemPolicy();
public Cache(long CacheSize)
{
CIPOL.RemovedCallback = new CacheEntryRemovedCallback(CacheItemRemoved);
NameValueCollection CacheSettings = new NameValueCollection(3);
CacheSettings.Add("CacheMemoryLimitMegabytes", Convert.ToString(CacheSize));
CacheSettings.Add("physicalMemoryLimitPercentage", Convert.ToString(49)); //set % here
CacheSettings.Add("pollingInterval", Convert.ToString("00:00:10"));
MemCache = new MemoryCache("TestCache", CacheSettings);
}
public void AddItem(string Name, string Value)
{
CacheItem CI = new CacheItem(Name, Value);
MemCache.Add(CI, CIPOL);
lock (Statlock)
{
ItemCount++;
size = size + (Name.Length + Value.Length * 2);
}
}
public void CacheItemRemoved(CacheEntryRemovedArguments Args)
{
Console.WriteLine("Cache contains {0} items. Size is {1} bytes", ItemCount, size);
lock (Statlock)
{
ItemCount--;
size = size - 108;
}
Console.ReadKey();
}
}
}
namespace FinalCacheTest
{
internal class Program
{
private static void Main(string[] args)
{
int MaxAdds = 5000000;
Cache MyCache = new Cache(1); // set CacheMemoryLimitMegabytes
for (int i = 0; i < MaxAdds; i++)
{
MyCache.AddItem(Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
}
Console.WriteLine("Finished Adding Items to Cache");
}
}
}
为什么 记忆缓存不遵守配置的内存限制?