我正在寻找一种方法来挂钩ASP.NET缓存机制中的垃圾收集例程。作为测试,我将以下代码放在.aspx文件中。我希望CacheItemRemoveCallback被触发,但事实并非如此。有谁知道为什么?是因为我在MS Web Development Server下运行而不是完整的IIS实例?
private static List<string> _bigData = new List<string>();
protected void Page_Load(object sender, EventArgs e)
{
Cache.Add("a", " ".PadRight(1048576), null, DateTime.Now.AddYears(1), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Low,
new System.Web.Caching.CacheItemRemovedCallback((s, o, r) => {
// This code is never run
}));
while (true)
{
_bigData.Add(" ".PadRight(1048576));
Thread.Sleep(50);
}
}
答案 0 :(得分:1)
我希望解雇CacheItemRemoveCallback
为什么你会这么想?
我希望你能在32位计算机(*)上快速获得OutOfMemoryException
- 大约一分钟后,你的列表中大约会有1.2GB。
(*)除非使用/ 3GB开关启动操作系统,在这种情况下,它的行为与64位计算机上的32位进程类似。
在64位计算机上,您的请求将在默认值为90秒时计时,届时它将向您的静态列表添加90 * 200 = 1800项=约1.8GB。一个64位进程将处理这个问题,如果它是LARGEADDRESSAWARE,那么在64位计算机上可能会有一个32位进程可以这样做,这绝对是IIS的情况。不确定卡西尼。
此外,ISS可能会在达到此虚拟内存使用级别时回收您的应用程序域,具体取决于应用程序池的配置方式。
我会更改您的测试以重复添加项目到缓存,而不是静态列表。