AppDomain是什么回收

我想弄清楚什么是AppDomain回收? 当第一次从DotNet应用程序请求一个aspx页面时,我明白为该应用程序创build了一个appdomain,并且将所需的程序集加载到该appdomain中,并将请求该请求。 现在,如果web.config文件或bin文件夹的内容等被修改,appdomain将被“回收”。 我的问题是,在回收过程结束时,应用程序域是否会装载程序集并准备好提供下一个请求? 或者必须要求页面触发程序集加载?

那么,我认为这个线索正在顺利地进行到最后的结论,但是到最后,情况就是如此。

我会尝试根据我的理解来回答这个问题,并利用我刚刚在其他网站上读到的内容。

首先,我自己试图避免除了应用程序池之外的术语“回收”,因为这可能使某人感到困惑。 现在,进入到进程,池和AppDomain,我看到如下图片:

简而言之,应用程序池是由称为W3WP.exe的进程(又称工作进程)维护并运行的内存区域。 回收应用程序池意味着将该进程closures,将其从内存中删除,然后使用新分配的进程标识创build全新的工作进程。

关于应用程序域,我把它看作是存储区域的子集,在前面提到的区域中扮演着一个容器的angular色。 换句话说,在这种情况下,内存中的进程W3WP.exe是存储子集区域的应用程序的macros内存区域,称为应用程序域。 尽pipe如此,内存中的一个进程可能会存储不同的应用程序域,一个用于分配给在给定应用程序池内运行的每个应用程序。

就我刚开始讲的回收而言,这是我自己只为应用程序池预留的东西。 对于AppDomains,我更喜欢使用术语“重新启动”,以避免误解。 基于此,重新启动AppDomain意味着通过新添加的设置(例如,刷新现有configuration)来启动给定的应用程序。 这发生在称为AppDomain的内存子区域的边界内,最终位于与相应应用程序池关联的进程内。 这些新的设置可能来自诸如

web.config,machine.config,global.asax,Bin目录,App_Code,

也可能有其他的。

AppDomain是相互隔离的,这是完全意义上的。 如果不是这样,如果更改为web.config(比如说应用程序1),请求回收池,则分配给该池的所有其他应用程序都将重新启动,而Microsoft和其他任何人都不希望这样做。

总结我的观点,

  • 进程(W3WP.exe)
    • AppDomain 1
    • AppDomain 2
    • AppDomain 3
    • AppDomain n

n =由给定的W3WP.exepipe理的应用程序池分配的应用程序的数量

  • 进程是彼此隔离的内存区域
  • AppDomain是在同一个进程内相互隔离的子内存区域
  • 全局IIS设置更改可能需要应用程序池回收(杀死并启动新的工作进程,W3WP.exe)
  • 应用程序范围内的设置更改了AppDomain的关注点,并且在某些特定文件(如上面概述的)发生更改后,它们可能会重新启动

有关更多信息,我build议:

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-thinksaspx#440333

一般来说。 由于编译和创buildAppDomain,在ASP.NET网站上所谓的“第一次打击”通常需要更长的时间。

无论何时您部署网站 – 请确保使用Visual Studio中的“发布网站”function来预编译您的网站。 那么“第一击”的惩罚就会减less。 并记住将configuration设置为释放,而不是debugging!

回收closures托pipeappdomain的进程。 你会注意到当你回收它时PID会改变。

卸载AppDomin只需卸载AppDomain中的所有程序集,然后可以重新使用。

重要的是要记住,一旦CLR被加载到一个进程中,它不能被删除。 因此,如果您需要在加载CLR时立即执行某些操作,那么只需卸载AppDomain将无济于事,因为CLR将不会被重新加载。

也不是说IIS不是唯一可以托pipeAppDomain的进程 – 任何进程都可以,而且你并不总是想杀死整个进程来卸载你的程序集。

如果您的页面是“可更新的”,则必须在使用前进行编译。 这意味着,是的,在第一次请求时,程序集被加载,编译,并准备好访问。 每当这些文件被改变(甚至一些病毒软件可以通过改变文件的修改date来触发这个),appdomain被回收。

您可以将您的Web应用程序configuration为不可更新。 所有东西都被编译成DLL文件,在虚拟目录中你将看不到任何.ASPX或者.CS文件。 它使你的代码更难更新(需要在你的网页上添加一些额外的文本?重新编译的时间!),但它增加了你的Web应用程序的可用性。

但是,如果任何文件被改变,这仍然不会阻止您的网页应用程序被回收。 例如,如果你编辑web.config,你的appdomain即使被编译也会回收。