2008-09-01 25 views
37

私は正確にAppdomainのリサイクルを把握しようとしていますか? DotNetアプリケーションからaspxページが初めて要求されると、そのアプリケーションのappdomainが作成され、必要なアセンブリがそのappdomainにロードされ、要求が提供されることがわかります。 web.configファイルやbinフォルダの内容などが変更された場合、appdomainは「リサイクル」されます。 私の質問は、リサイクルプロセスの最後に、appdomainにアセンブリがロードされ、次のリクエストを処理する準備ができているかどうかです。またはロードするアセンブリをトリガするためにページを要求する必要がありますか。Appdomainのリサイクルは何ですか

答えて

60

まあ、スレッドは最終的な結論にスムーズになっていたと思いますが、最終的にはそうではありませんでした。

私は自分の理解に基づいて質問に答えようとしており、他のウェブサイトで読んだことを活用しています。

まず、アプリケーションプール以外の用語はリサイクルを避けるようにしています。これは、誰かを混乱させる可能性があるためです。今、プロセス、プール、AppDomainに移動すると、次のような画像が表示されます。

アプリケーションプールは、要するにW3WP.exeという名前のプロセスによって管理されているメモリ領域です。 。アプリケーションプールのリサイクルとは、プロセスを停止し、メモリから削除した後、新しく割り当てられたプロセスIDを使用して新しいワーカープロセスを開始することを意味します。

アプリケーションドメインに関しては、前述の領域内のコンテナの役割を果たすメモリ領域のサブセットとして認識しています。言い換えれば、メモリ内のプロセス(この場合はW3WP.exe)は、アプリケーションドメインと呼ばれるサブセット領域を格納するアプリケーションのマクロメモリ領域です。言い換えると、メモリ内の1つのプロセスは、特定のアプリケーションプール内で実行するように割り当てられたアプリケーションごとに1つずつ、異なるアプリケーションドメインを格納することができます。

私が最初に言ったように、リサイクルに関しては、自分自身がアプリケーションプール用に予約しているものです。 AppDomainsでは誤解を避けるために「再起動」という用語を使用することをお勧めします。これに基づいてAppDomainを再起動するということは、既存の構成を更新するなど、新しく追加された設定で特定のアプリケーションを開始することを意味します。これはAppDomainというメモリのサブ領域の境界内で発生し、最終的にはそれぞれのアプリケーションプールに関連付けられたプロセス内に存在します。これらの新しい設定は、このような

web.configファイル、 のmachine.config、 のglobal.asax、 Binディレクトリ、 にApp_Code、

などのファイルから来るかもしれないし、他の人があるかもしれません。

AppDomainは完全に意味があります。そうでない場合、web.configに変更が加えられたら、アプリケーション1のプールのリサイクルを要求し、そのプールに割り当てられている他のアプリケーションはすべて再起動します。

私のポイントをまとめると、

  • プロセス(のW3wp.exe)
    • アプリケーションドメイン1つの
    • アプリケーションドメイン2
    • アプリケーションドメイン3
    • アプリケーションドメインN

N =所与のW3wp.exeによって管理アプリケーションプールに割り当てられたアプリケーションの数

  • プロセスは、メモリ領域は内で、別の
  • アプリケーションドメインは、サブメモリ領域は、互いに分離されているものから分離されています同じプロセス
  • IISの設定を変更すると、アプリケーションプールのリサイクルが必要になる場合があります(新しいワーカープロセスの強制終了と開始、W3WP)。exeファイル)
  • アプリケーション全体の設定は、のAppDomainの懸念を変更し、彼らは、そのような更なる情報については

上記のものの概要など、いくつかの特定のファイルの変更後に再起動を受けることがあり、私はお勧め:

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

ブラジルからよろしく!

7

はこれを見てください - それを説明するかもしれない:一般的に

http://weblogs.asp.net/owscott/archive/2006/02/21/ASP.NET-v2.0-2D00-AppDomain-recycles_2C00_-more-common-than-before.aspx#440333

を。 ASP.NET Webサイトでの「最初のヒット」と呼ばれるものは、通常、コンパイルやAppDomainの作成に時間がかかります。

サイトを展開するたびに、Visual Studioで[Webサイトの公開]機能を使用して、Webサイトを事前にコンパイルする必要があります。その後、「最初のヒット」のペナルティが軽減されます。また、デバッグではなくリリースに設定することを忘れないでください!

+0

(+1)リンクありがとうございます。この記事のTessの記事へのリンクがあります。これは必見です。 –

1

ページが「更新可能」である場合は、使用前にコンパイルする必要があります。つまり、最初のリクエストでアセンブリが読み込まれ、コンパイルされ、アクセス準備が整えられます。これらのファイルが変更されるたびに(ファイルの変更日を変更することによって、ウイルスソフトウェアによってもこれが引き起こされることがあります)、appdomainはリサイクルされます。

Webアプリケーションを更新できないように設定できます。すべてがDLLにコンパイルされ、仮想ディレクトリに.ASPXまたは.CSファイルは表示されません。それはあなたのコードを更新するのをより困難にします(あなたのウェブページにいくつかの追加のテキストを置く必要がありますか?再コンパイルの時間!)が、あなたのWebアプリケーションの可用性を高めます。

しかし、ファイルが変更されてもリサイクルできなくなることはありません。たとえば、web.configを編集すると、appdomainはコンパイルされていてもリサイクルされます。

2

リサイクルは、appdomainをホストしているプロセスをシャットダウンします。リサイクルすると、PIDが変化することがわかります。

AppDominをアンロードするだけでAppDomain内のすべてのアセンブリがアンロードされ、再利用できます。

覚えておくべき重要なことは、いったんCLRがプロセスにロードされると、削除できないということです。したがって、CLRがロードされるとすぐに何かをする必要がある場合は、CLRが再ロードされないため、AppDomainをアンロードするだけでは役に立ちません。

また、IISはAppDomainをホストできる唯一のプロセスではありません。どのプロセスでも構いませんが、アセンブリをアンロードするだけでプロセス全体を強制終了する必要はありません。

関連する問題