关于asp.net:什么是Appdomain回收

关于asp.net:什么是Appdomain回收

What exactly is Appdomain recycling

我试图弄清楚Appdomain回收到底是什么?
当我第一次从DotNet应用程序请求一个aspx页面时,我了解到已为该应用程序创建了一个appdomain,并将所需的程序集加载到了该appdomain中,并且将处理该请求。
现在,如果修改了web.config文件或bin文件夹的内容等,则appdomain将被"回收"。
我的问题是,在回收过程结束时,appdomain会加载程序集并准备服务下一个请求吗? 还是需要一个页面来触发程序集加载?


好吧,我认为主题进展顺利,但最终还是相反。

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

首先,我本人尽量避免使用术语"循环",而不是"应用程序池",因为这可能会使人感到困惑。现在,开始处理,池和AppDomain,我看到如下图:

简而言之,应用程序池是由称为W3WP.exe的进程(也称为工作进程)维护并运行的内存区域。回收应用程序池意味着关闭该进程,将其从内存中删除,然后使用新分配的进程ID发起一个全新的Worker进程。

关于应用程序域,我将其视为存储区域的子集,位于上述充当容器的区域中。换句话说,内存中的进程W3WP.exe在这种情况下是用于存储子集区域(称为应用程序域)的应用程序的宏存储区域。话虽这么说,内存中的一个进程可能会存储不同的应用程序域,每个分配给指定应用程序池的应用程序都将运行一个应用程序域。

正如我最初所说,在回收方面,我自己只为应用程序池保留这些内容。对于AppDomain,我更喜欢使用术语"重新启动",以避免误解。基于此,重新启动AppDomain意味着使用新添加的设置(例如刷新现有配置)从给定的应用程序开始。这发生在称为AppDomain的内存子区域的边界之内,该子区域最终位于与各个应用程序池关联的进程中。这些新设置可能来自以下文件:

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

可能还有其他。

AppDomain相互隔离,这很有意义。如果不是这样,例如,如果对应用程序1的web.config进行了更改,则退出了池的回收,分配给该池的所有其他应用程序将重新启动,这绝对不是Microsoft和其他任何人所希望的。

总结一下我的观点,

  • 进程(W3WP.exe)

    • AppDomain 1
    • AppDomain 2
    • AppDomain 3
    • AppDomain n

n =由给定W3WP.exe管理的向应用程序池分配的应用程序数

  • 进程是彼此隔离的内存区域
  • AppDomain是在同一过程中彼此隔离的子内存区域
  • 全局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!


回收会关闭托管appdomain的进程。您会注意到PID在回收时会发生变化。

卸载AppDomin只是卸载AppDomain中的所有程序集,然后可以重用它们。

要记住的重要一点是,一旦将CLR加载到进程中,就无法将其删除。因此,如果您需要在CLR加载后立即做某事,那么简单地卸载AppDomain就无济于事,因为CLR不会重新加载。

同样不是说IIS不是唯一可以承载AppDomain的进程-任何进程都可以,并且您并不总是想要仅卸载程序集就杀死整个进程。


如果您的页面是"可更新的",则必须在使用前对其进行编译。就是说,是的,在第一次请求时,程序集就被加载,编译并准备好进行访问。只要更改了这些文件(甚至某些病毒软件都可以通过更改文件的修改日期来触发此操作!),appdomain就会被回收。

您可以将您的Web应用程序配置为不可更新。一切都编译成DLL,并且在虚拟目录中看不到任何.ASPX或.CS文件。它使您的代码难以更新(需要在网页上添加一些其他文本?重新编译!),但是它增加了Web应用程序的可用性。

但是,如果任何文件被更改,这仍然不会阻止您的Web应用程序被回收。例如,如果您编辑web.config,则即使您的应用程序域已编译,它也将回收。


推荐阅读