0

我正在寻找一种连接到 ASP.NET 缓存机制中的垃圾收集例程的方法。作为测试,我将以下代码放入 .aspx 文件中。我希望 CacheItemRemoveCallback 被解雇,但事实并非如此。有谁知道为什么?是因为我在 MS Web 开发服务器而不是完整的 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);
        }
    }
4

1 回答 1

1

我希望 CacheItemRemoveCallback 被解雇

你为什么这么期待?

我希望您能OutOfMemoryException在 32 位机器 (*) 上相当快地获得一个 - 大约一分钟后,到那时您的列表中将有大约 1.2GB。

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

在 64 位机器上,您的请求将在默认的 90 秒时计时,到那时它将向您的静态列表添加 90*200 = 1800 个项目 = 大约 1.8GB。一个 64 位进程将处理这个问题,如果它是 LARGEADDRESSAWARE 的话,一个 32 位进程可能能够在 64 位机器上执行此操作,对于 IIS 肯定是这种情况;不知道卡西尼号。

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

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

于 2013-07-05T10:30:39.480 回答