Tôi đang làm việc với lớp .NET 4.0 MemoryCache trong một ứng dụng và cố gắng giới hạn kích thước bộ nhớ cache tối đa, nhưng trong các thử nghiệm của tôi, có vẻ như bộ nhớ cache không thực sự tuân theo các giới hạn.
Tôi đang sử dụng các cài đặt, theo MSDN , được cho là để giới hạn kích thước bộ nhớ cache:
- CacheMemoryLimitMegabyte : Kích thước bộ nhớ tối đa, tính bằng megabyte, mà một phiên bản của đối tượng có thể tăng lên. "
- PhysicalMemoryLimitPercentage : "Phần trăm bộ nhớ vật lý mà bộ nhớ đệm có thể sử dụng, được biểu thị dưới dạng giá trị số nguyên từ 1 đến 100. Giá trị mặc định là 0, điều này cho biết cácphiên bản MemoryCache quản lý bộ nhớ 1 của riêng chúngdựa trên dung lượng bộ nhớ được cài đặt trên máy vi tính." 1. Điều này không hoàn toàn chính xác - bất kỳ giá trị nào dưới 4 đều bị bỏ qua và thay thế bằng 4.
Tôi hiểu rằng các giá trị này là gần đúng và không phải là giới hạn cứng vì chuỗi xóa bộ nhớ cache được kích hoạt sau mỗi x giây và cũng phụ thuộc vào khoảng thời gian bỏ phiếu và các biến không có tài liệu khác. Tuy nhiên, ngay cả khi tính đến những khác biệt này, tôi vẫn thấy kích thước bộ nhớ cache hoàn toàn không nhất quán khi mục đầu tiên bị loại bỏ khỏi bộ nhớ cache sau khi đặt CacheMemoryLimitMegabytes và PhysicalMemoryLimitPercentage cùng nhau hoặc riêng lẻ trong một ứng dụng thử nghiệm. Để chắc chắn, tôi đã chạy mỗi bài kiểm tra 10 lần và tính toán con số trung bình.
Đây là kết quả của việc kiểm tra đoạn mã ví dụ dưới đây trên PC chạy Windows 7 32 bit có RAM 3GB. Kích thước của bộ nhớ cache được lấy sau lần gọi đầu tiên đến CacheItemRemoved () trong mỗi lần kiểm tra. (Tôi biết kích thước thực của bộ nhớ đệm sẽ lớn hơn kích thước này)
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
Đây là ứng dụng thử nghiệm:
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");
}
}
}
Tại sao MemoryCache không tuân theo giới hạn bộ nhớ đã định cấu hình?