我想知道什么是Appdomain回收?当我第一次从DotNet应用程序请求aspx页面时,我知道该应用程序的appdomain已创建,并且所需的程序集已加载到该appdomain中,并且将提供该请求.现在,如果修改了web.config文件或bin文件夹的内容等,appdomain将被"回收".我的问题是,在回收过程结束时,appdomain是否会加载程序集并准备好为下一个请求提供服务?或者必须要求页面触发程序集加载?
好吧,我认为这个主题得到了顺利的最终结论,但最终还是如此.
我将尝试根据我的理解回答这个问题,并利用我刚刚在其他网站上阅读的内容.
首先,我自己试图避免除了应用程序池之外的术语回收,因为这可能会让人感到困惑.现在,进入流程,池和AppDomain,我看到如下图片:
简而言之,应用程序池是由称为W3WP.exe(即工作进程)的进程维护并运行的内存区域.回收应用程序池意味着将该进程关闭,从内存中删除它,然后使用新分配的进程ID发起一个全新的工作进程.
关于应用程序域,我将其视为内存区域的子集,在上述区域内扮演容器的角色.换句话说,在这种情况下,内存中的进程W3WP.exe是存储子集区域的应用程序的宏内存区域,称为应用程序域.话虽如此,内存中的一个进程可以存储不同的应用程序域,每个应用程序域一个用于分配给在给定应用程序池中运行的每个应用程序.
谈到回收,正如我最初所说,这是我自己只保留应用程序池的东西.对于AppDomains,我更喜欢使用术语"重启",以避免误解.基于此,重新启动AppDomain意味着使用新添加的设置(例如刷新现有配置)启动给定应用程序.这发生在称为AppDomain的内存子区域的边界内,最终位于与相应应用程序池关联的进程内.这些新设置可能来自诸如此类的文件
web.config,machine.config,global.asax,Bin目录,App_Code,
而且可能还有其他人.
AppDomain彼此隔离,这是完全有道理的.如果不是这样,如果对应用程序1的web.config进行了更改,请求池的再循环,分配给该池的所有其他应用程序将重新启动,这是微软和其他任何人都不希望的.
总结我的观点,
进程(W3WP.exe)
AppDomain 1
AppDomain 2
AppDomain 3
AppDomain
n =由给定W3WP.exe管理的应用程序池的已分配应用程序数
进程是彼此隔离的存储区域
AppDomains是在同一进程内彼此隔离的子内存区域
全局IIS设置更改可能需要应用程序池回收(杀死并启动新的工作进程,W3WP.exe)
应用程序范围的设置会更改AppDomains问题,并且在某些特定文件(例如上面概述的文件)发生更改后,它们可能会重新启动
有关详细信息,我建议:
http://blogs.msdn.com/b/david.wang/archive/2006/03/12/thoughts-on-iis-configuration-changes-and-when-it-takes-effect.aspx
是什么原因导致IIS中的应用程序池回收?
http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx
来自巴西的问候!
看看这个 - 这可能解释了它:
http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0- 2D00 -AppDomain-recycles_2C00_-more-common-than-before.aspx#440333
一般来说.由于编译和创建AppDomain,ASP.NET网站上所谓的"第一次点击"通常需要更长的时间.
每当您部署站点时 - 请确保使用Visual Studio中的"发布网站"功能来预编译您的网站.然后减少"第一击"惩罚.并记得将配置设置为Release,而不是Debug!