iis回收能清除记忆吗?

时间:2016-03-22 06:02:16

标签: asp.net iis

我正在将一个Web应用程序部署到IIS,我的应用程序使用静态字典,它经常从外部api填充。

有时我会观察到词典偶尔被清除了一段时间。我怀疑是因为IIS自动回收。

任何人都可以确认这可能是一个原因吗? 所以基本上我的问题是IIS Recycle会清理webapp正在使用的静态内存吗? (虽然我知道只有在没有与服务器的活动连接时才会发生这种情况)

2 个答案:

答案 0 :(得分:0)

如果您查看此MS文章:https://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx

  

除了在出现问题时按需回收应用程序池,您还可以配置应用程序池以回收工作进程,原因如下:   在预定的时间

     
      
  • 经过一段时间后

  •   
  • 达到多项要求后

  •   
  • 达到虚拟内存阈值后

  •   
  • 达到已用内存阈值后

  •   

因此,如果IIS回收不会清理内存回收,那么内存阈值就没有意义了。此外,IIS回收会导致应用程序重新启动,因此它显然也会清除内存。

答案 1 :(得分:0)

是的,默认情况下,IIS会通过调用垃圾收集器来回收您的应用程序池,以便每20分钟清除一次内存。

您可以在应用池中看到空闲超时设置 - >高级设置,但最好不要更改它。

所有静态的东西都是"坏"不要使用它们,你的选择是缓存。您可以创建使用默认MVC缓存的通用缓存服务,并使其成为线程安全的。

您还可以在子操作控制器上使用[OutputCache]属性并设置分钟。在此间隔之间,数据将被缓存

或者您可以实现自己的缓存逻辑。

从这三件事中我建议你使用默认的MVC缓存。我将通过#TelerikAcademy和#NikolayKostov

为您提供示例实现
namespace Eshop.Services.Common
{
using System;
using System.Web;
using System.Web.Caching;
using Contracts;

public class HttpCacheService : IHttpCacheService
{
    private static readonly object LockObject = new object();

    public T Get<T>(string itemName, Func<T> getDataFunc, int durationInSeconds)
    {
        if (HttpRuntime.Cache[itemName] == null)
        {
            lock (LockObject)
            {
                if (HttpRuntime.Cache[itemName] == null)
                {
                    var data = getDataFunc();
                    HttpRuntime.Cache.Insert(
                        itemName,
                        data,
                        null,
                        DateTime.Now.AddSeconds(durationInSeconds),
                        Cache.NoSlidingExpiration);
                }
            }
        }

        return (T)HttpRuntime.Cache[itemName];
    }

    public void Remove(string itemName)
    {
        HttpRuntime.Cache.Remove(itemName);
    }
}

}

使用它非常简单,具有匿名功能和时间间隔

您可以将其设置为基本控制器的受保护属性,并在您使用的每个控制器中继承BaseController。比你在每个控制器都有缓存服务,你可以简单地使用它

var newestPosts = this.Cache.Get(
     "newestPosts",
      () => this.articlesService.GetNewestPosts(16).To<ArticleViewModel().ToList(), 
           GlobalConstants.DefaultCacheTime);

我们假设GlobalConstants.DefaultCacheTime = 10

希望这个答案对你有用。 :)