2012-06-14 6 views
5
MyObject obj = new MyObject(); 

私は新しいキーワードがコンストラクタを呼び出し、マネージヒープ内のオブジェクトを初期化することを知っています。私はMyObject obj = new MyObject()を与えたとき何が起こっているのですか?

私の質問は、以下のCLRのやり方です。

  1. 上記の行はどのようにCLRによって実行されますか?
  2. CLRによってオブジェクトにmemeoryがどのように割り当てられていますか?
  3. CLRはオブジェクトのサイズをどのように決定するのですか?
  4. ヒープからオブジェクトのメモリを割り当てる領域がない場合、CLRはそれをどのように知るでしょうか?
+5

私はあなたに良い洞察を得るために 'C#' - Jeffrey Richterを読むことをお勧めします – V4Vendetta

答えて

2

リファレンスタイプが作成されるとき(クラス、デリゲート、インターフェイス、文字列、またはオブジェクト)、ヒープに割り当てられます.Netには4つの異なるヒープ(gen0、gen1、gen2) 、およびLOH(ラージ・オブジェクト・ヒープ)です。 85k以下のものは、作成時間(gen0からgen1にgen2に移動したものなど)に応じて、最初の3つのヒープのいずれかに移動します。 85kより大きいオブジェクトはLOHに配置されます。 LOHは圧縮されないので、最終的には、オブジェクトがそのメモリ空間に散在すると、最終的にOOMエラーが発生します。これらは管理されたヒープとして知られています。

オブジェクトを作成するには、新しいキーワードを使用するだけです。 .NETは、適切なヒープにオブジェクトを作成、初期化、配置し、必要な余分なメモリを確保します。その後、あなたはそれを終えたときに削除する必要がないので、あなたはそのオブジェクトをかなり忘れることができます。

新しいキーワードを使用して参照型オブジェクトを作成すると、そのキーワードはヒープに配置され、参照は現在実行中のスタックで使用されます。あなたのオブジェクトがrefrenceとして使用することができ、他の可能なソースがあります。

  1. グローバル/静的オブジェクト参照
  2. CPUは、渡された(後で)
  3. オブジェクトのファイナライズ参照
  4. 相互運用基準(.NETオブジェクトを登録しますCOM/APIコールに)
  5. スタック参照(主にここで使用)

これら5が実際にWHEからGCルートノードでありますreオブジェクト参照階層が形成されます。通常、Orderクラスを格納するコレクションを持つクラシックCustomerクラスを想像してください。オーダーがオーダーコレクションに追加されると、コレクション自体は追加されたオーダーへの参照を保持します。 Customerクラスのインスタンスにもスタック参照がある場合。

これは、複雑なオブジェクトに対して階層が形成される方法です。これは、GCが参照をどのように参照するかを示します。

e:g。 カスタマーオブジェクトのスタック参照 - オーダーのリストオブジェクトへの参照 - >個々のオーダーを参照します。

これら5つのルーツからの緩い参照はGCになりがちです。メモリがオブジェクトに割り当てられているか

は少し複雑で、それがusally指定http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

簡単な例は、可能性としてMKKと時間で成長:

class MyClass 
{ 
    string Test="Hello world Wazzup!"; 
    byte[] data=new byte[86000]; 
} 

それはMyClassのサイズと仮定するのは簡単です割り当てられた場合:

•19文字

•86,000バイト。

実際には、オブジェクトのサイズには一般的なクラスだけが含まれ、オブジェクトポインタを文字列に格納するために必要なメモリとバイト配列(クラスレベルの変数)がヒープに別々に割り当てられます。文字列はSOHに割り当てられ、そのオブジェクト参照はクラスのインスタンスによって保持されます。バイト配列は85 KBより大きいので、LOHに割り当てられます。

SOHは圧縮可能であり、断片化は起こりませんが、LOHはメモリ内で断片化する可能性があります。

よろしくお願いいたします。

関連する問題