2016-03-22 158 views
0

我正在将一个Web应用程序部署到IIS,我的应用程序使用静态字典,这是经常从外部api填充的。iis回收是否清理内存?

有时我观察到词典正在被清除一次&我怀疑这是因为IIS自动回收。

任何人都可以请确认这可能是一个原因吗? 所以基本上我的问题是IIS回收会清理Web应用程序使用的静态内存? (虽然我知道,当有与服务器的任何活动连接,这只会发生)

回答

0

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

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

  • 经过时间后

  • 达到数量要求

  • 的达到虚拟内存阈值

  • 达到使用内存阈值

后后后,所以,如果IIS回收不会清理内存回收它在内存门槛上是没有意义的。此外,IIS回收会导致应用程序重新启动,因此它显然也会清除它的内存。

1

是的,默认情况下,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

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