2015-11-26 9 views
6

単純な.net .exeアプリケーションがあります。一度実行されたライフサイクルは何ですか?私の理解では、次のことが起こるということである:上記の.netアプリケーションのライフサイクルとは何ですか。

> 1. OS loads exe assemblies into memory 
> 2. OS checks if it is in fact .net assembly 
> 3. mscoree.dll loads, and loads CLR 
> 4. CLR takes over and loads external dlls, GC stuff, memory management etc. 
> 5. CLR creates app domain where exe assemblies are loaded 
> 6. exe is started 

が正確である(詳しく説明すること自由に感じなさい)、私は最後のステップ、CLRロードアセンブリに興味を持っています。

  1. 作成されるスタック、ヒープ、スレッドの数はいくつですか?スレッドは作成され、実行可能ファイル内のコードが実行されますか?
  2. 割り当てられた初期メモリのサイズは何ですか、誰がメモリを割り当てるか(OSまたはCLR?)
  3. どのくらいのメモリが最初に必要であるかはどのようにしてわかりますか?
  4. exeが実行されているときにさらに多くのメモリが必要な場合は、誰がこのメモリをどのくらい割り当てるかを決定しますか?
  5. EXEを閉じるとどうなりますか?CLRはアプリケーションドメインをアンロードする前にすべてのGCを実行しますか? (exeを閉じて)、またはOSは?
+5

"CLR via C#"を購入するか、ブログシリーズ "CLR Inside Out"を読んでください。これは適切に答えるには広すぎる方法です。あなたの質問のそれぞれが以前に答えられたことは確かです。 – CodeCaster

答えて

1

まあ、プロセス自体はあなたが書いたより少し複雑です。いくつかのステップには、ステップ1やPEのロード方法(およびmscoree.dll自体がロードされる方法)の中に内部ステップが含まれるなど、多少考えられるかもしれません。

しかし、私はあなたの質問に答えようとします。あなたの質問がちょっと大きいことに気づくだけで、簡単に答えてみました。しかし、本当に興味があるのであれば、CLR(C#、リヒター)を読むことを強くお勧めします。彼は最初の章でローディングプロセスについて説明し、ガベージコレクタ専用の章を持っています。

興味深いガベージコレクタの基本については、MSDNの記事もあります。

作成されるスタック、ヒープ、スレッドの数はいくつですか?スレッドは作成され、実行可能ファイル内のコードが実行されますか?

シンプル(空の)コンソールアプリケーションには、メインスレッド、GCスレッド、ファイナライザースレッドの3つのスレッドがあります。もちろん、それぞれのスレッドはそれ自身のスタックを持っています(それぞれ1MB)。

ヒープ数は、使用しているGCタイプによって異なります。 Workstation GC(デフォルト)を使用している場合は、マネージド・ヒープが1つ(2つのセグメント、1つは「通常の」オブジェクト用、もう1つはラージ・オブジェクト・ヒープ・セグメント用)です。

サーバーGCで作業している場合、システムで使用できる各論理コアごとに1つのヒープがあります(2つのセグメントを持つヒープのそれぞれに1つのヒープがあります)。初期メモリは複数の要素で構成されてい

メモリ割り当て、割り当てられた初期メモリのサイズ?何である

(OSやCLRは?):各スレッドの1MBのスタックがありますプロセスにロードされたイメージのサイズ(アプリケーションに依存します)があります。サイズには "動的な"要素があります。これはアプリケーションでの割り当てで、GCがヒープサイズを大きくし、使用していないオブジェクトをGCできれいにし、GCにメモリを解放させる可能性があります。

exeが実行されているときにさらに多くのメモリが必要な場合は、誰がこのメモリをどのくらい割り当てるかを決定しますか?

単純なコンソールアプリケーションがある場合は、メインの内部に新しいクラスのインスタンスが作成されます。その場合、 "new"キーワード(CIL "newobj"命令)はCLRに必要なメモリ量を計算させます。

世代0(新しく作成されたオブジェクトが格納される)に十分なメモリがある場合、追加のメモリ割り当てはありません。十分なメモリがない場合、GCは起動し、VirtualAllocを呼び出してオブジェクトのメモリを割り当てます。このシナリオでは、新規に作成されたオブジェクトの参照がスタックに保存されます。

もちろん、参照が保存される場所(スタック、ヒープ、プロセッサレジスタ)とオブジェクトが割り当てられる場所(スタック/ヒープ)は異なる場合があります。基本的には、クラスや構造体の割り当てについて話しているかどうか、割り当てのコンテキストは何か(依存するメソッドの場合、他のクラスのフィールド、構造体のフィールドなど)によって異なります。また、プラットフォームによって異なる場合もあります。

exeが実行されているときにさらに多くのメモリが必要な場合は、誰がこのメモリをどのくらい割り当てるかを決定しますか?

プロセスで作成された新しいオブジェクトのメモリ割り当てはすべて、CLR(もちろん、CLRはVirtualAllocやVirtualFreeなどのWindows APIや仮想メモリ自体を管理するWindows APIを使用します)によって管理されます。

管理されたヒープで作成する必要がある新しいオブジェクトを作成するために「新しい」演算子を使用すると、CLRは割り当てに必要なサイズを計算します(すべてのフィールドのサイズ+ obオブジェクトそれがどのタイプであるかを知っている)、管理されたヒープに空き領域があるかどうかを確認します(世代0では、CLRは常に新しいオブジェクトを割り当てる場所へのポインタを保持します)。そうであれば、それを使用します。それ以外の場合、メモリが不足しているとガーベッジコレクションが開始され、時には(gcプロセスの後のメモリの状態やその他のものによって異なります)VirtualAllocはCLRによって呼び出され、プロセスにさらにメモリを割り当てます。

EXEを閉じるとどうなりますか?アプリケーションドメインをアンロードする前にCLRがGCを実行していますか? (exeを閉じて)、またはOSは?

CLRはapp-domainをアンロードする前にクイックGCを実行します。このクイックGCの目的は、ファイナライズする機会を最終化することです。プロセスを終了するときには、OSがとにかくそれを行うので、CLRがメモリをクリーニングする必要はありません。

希望します。

+0

#3。コード内に新しい辞書()があるとしますが、メインスレッド(CLR)のアカウントは?、ヒープのサイズを増やしますか?新しいDict行を読む前に、ヒープの初期サイズは何ですか? – ShaneKm

+0

私の答えを編集しました、それがもう少し答えて欲しいと思っています... –

+0

* Server GCで作業している場合は、システムで使用可能な論理スレッドごとに1つのヒープがあります。 –

8

いくつのスタック、ヒープ、スレッドが作成されますか?

アプリケーションが稼働しているプロセスでは、多くのスレッドが存在する可能性があります。しかし、そのうちの1つが実行の主なスレッドになります。

スレッドが作成されると、1 MBのスタックが割り当てられます。メモリ(OSまたはCLR?)共通言語ランタイムのガベージコレクタは、アプリケーション

の割り当て とメモリの解放を管理 here

記載されているよう

を割り当て

これは、管理されていないプログラムCまたはC++でプログラミングしたことがあれば、この責任は開発者に属し、ガベージコレクタには属していないことは間違いなく知っています。それは大きな力です。しかし、大きな力で大きな責任がもたらされます。あなたは、必要なメモリスペースを見つける(作成する)責任があります。次にオブジェクトを割り当てます。必要がなければ、このメモリを解放する必要があります。上記のプロセスで間違いが起こると、メモリリークやプログラムのクラッシュにつながります。このようなバグをトラブルシューティングするのは難しいだけではありません。

一方、マネージプログラム(C#、Java、JavaScriptなど)の世界では、この責任はガベージコレクタと呼ばれるランタイムの一部に属します。ガベージコレクタはメモリを割り当てて、適切な時間に蹴り出してゴミを捨てるときに決定します。これは独自のものから、開発者の生活を大幅に簡単にするのに非常に便利です。しかしそれはトレードオフです。管理されたプログラムは、うまく構造化された管理されていないプログラムのパフォーマンスに打撃を与えることはできません。

EXEを閉じると、CLRはアプリケーションドメインをアンロードする前にすべてのGCを実行しますか? (exeを閉じて)、またはOSは?

実行可能ファイルを閉じると、アプリケーションドメインのアンロードが行われる前に、行われるものの一つが、解放すべき使用するリソースのために、ガベージコレクションです。その後、アプリケーションドメインはアンロードされます。この後、CLRはプロセスのメモリ空間から切り離され、最後にプロセスが強制終了されます。

関連する問題