什么是Appdomain回收

时间:2008-09-01 07:24:23

标签: asp.net

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

4 个答案:

答案 0 :(得分:64)

嗯,我认为这个主题得到了顺利的最终结论,但最终还是如此。

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

首先,我自己试图避免除应用程序池之外的术语回收,因为这可能会使某些人感到困惑。现在,进入流程,池和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

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

What causes an application pool in IIS to recycle?

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx

来自巴西的问候!

答案 1 :(得分:7)

看看这个 - 这可以解释一下:

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!

答案 2 :(得分:2)

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

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

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

也不是说IIS不是唯一可以托管AppDomain的进程 - 任何进程都可以,并且你并不总是希望在卸载程序集时终止整个进程。

答案 3 :(得分:1)

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

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

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