.NETネタです。自分なりにまとめたものです。
.NETでは、1プロセスの中に型やセキュリティを管理する単位として
アプリケーション・ドメイン(AppDomain)という器を作成し、その中で
処理を実行させる。
アプリケーション・ドメインは、CLRの起動時に3種類を作成する。
1)System Domain、2)Shared Domain、3)Default AppDomain
また、ユーザが独自(CreateDomain関数を使用)にドメインを作成
することも出来る。
但し、独自ドメインの使用用途はあまり多くないと思われる。
とりあえず、2つの例を挙げる。
1).NetにはWin32の時のFreelibrary関数(DLLを呼び出しプロセスの
アドレス空間から切り離す)のようなものはなく、一旦DLLをロード
したら通常はプロセスを終了するまでメモリに残り続ける。
この場合に独自ドメイン内にDLLをロードし、処理後に独自ドメイン
をアンロード(Unload)することで、Freelibrary関数の代わりとする
ことが可能であるが、独自ドメインの作成コストは大きい。
2)複数のEXEを1つのプロセスとして扱う場合に独自ドメインを使い
EXEをスレッド化して実行させる。
.NETアプリケーションは、1度目の起動が遅く2度目は速いですが
2度目以降は、必要なメモリがある程度確保されている上にCLRや
JITコンパイラなどの必要なモジュールが既にメモリ上に配置され
DISKアクセスが少なくなるOS上の機能によるものと思われます。
これは、JITコンパイラはコンパイル後のコードの永続化(ファイル
に保存すること)は行わないし、JITコンパイルされたコードは、
ユーザーがそのアプリケーションを終了すると破棄され、再度
起動したとしても、JITコンパイルはもう1度行われます。
また、AppDomainもプロセス終了すると同時に破棄されます。
NGENを使うことによりJITコンパイル済みイメージを作成すること
で起動を速くすることが可能ですが、AppDomainは作成すること
になりますので、1度目はその分のコストはかかります。
また、Assembly.LoadFromメソッドでNGENで作成したイメージは
使用できません。
参照サイト:
http://www.atmarkit.co.jp/fdotnet/technology/glossary01/glossary01_01.html
http://msdn.microsoft.com/msdnmag/issues/05/05/JITCompiler/default.aspx
http://msdn.microsoft.com/msdnmag/issues/06/02/CLRInsideOut/default.aspx
http://www.exconn.net/Blogs/team03/archive/2005/04/08/326.aspx
http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_05/idnfw11_05_01.html
http://www.shoeisha.com/mag/windev/pdf/870507/windev0507_178_Debug.pdf
http://www.codeproject.com/dotnet/AppDomainMemImprovement.asp#xx781235xx
http://msdn2.microsoft.com/ja-jp/library/6t9t5wcf(VS.80).aspx