当内存使用率很高时,为什么不从缓存中删除此项?

时间:2013-07-05 09:08:13

标签: asp.net caching

我正在寻找一种方法来挂钩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);
        }
    }

1 个答案:

答案 0 :(得分:1)

  

我希望解雇CacheItemRemoveCallback

为什么你会这么想?

我希望你能在32位计算机(*)上快速获得OutOfMemoryException - 大约一分钟后,你的列表中大约会有1.2GB。

(*)除非使用/ 3GB开关启动操作系统,在这种情况下,它的行为与64位计算机上的32位进程类似。

在64位计算机上,您的请求将在默认值为90秒时计时,届时它将向您的静态列表添加90 * 200 = 1800项=约1.8GB。一个64位进程将处理这个问题,如果它是LARGEADDRESSAWARE,那么在64位计算机上可能会有一个32位进程可以这样做,这绝对是IIS的情况。不确定卡西尼。

此外,ISS可能会在达到此虚拟内存使用级别时回收您的应用程序域,具体取决于应用程序池的配置方式。

我会更改您的测试以重复添加项目到缓存,而不是静态列表。