2

.NETのCLRについて次のように読みました。

CLRがロードされると、ヒープはSOHとLOHに分割されます。

  1. その時点でアプリケーションが開始されると、ヒープはそのサイズに応じてCLRによってアプリケーションに割り当てられます。

  2. LOHヒープには、Gen0、Gen1、およびGen2リージョンがあります。

ここでは、AクラスのすべてのオブジェクトがGen0に割り当てられています。

質問

  1. CLRは、ヒープ内のアプリケーションが占めるサイズをどのように認識しますか?
  2. Gen0領域にCLRによって割り当てられた4Kヒープメモリがあるとします。以下のコードを考えると、このシングルスレッドがGen0でフル4Kメモリを使用することは可能ですか?

    collect = new List();
    while(true)
    {
        collect.Add(new A());
        new A();
        new A();
    }
    
    class A
    {
        int a = 0, b = 0;
    }
    
4

1 に答える 1

1
  1. これは、宣言されたすべてのフィールドのサイズを、そのタイプを確実に考慮して計算することによって行われると思います。詳細については、MSDN 「メモリの割り当て」を参照してください。
  2. MSDNの論文「AutomaticMemoryManagement」に関して、すべての新しいオブジェクト(Brian Rasmussenが以下のコメントで述べているように-世代はSOHにのみ適用可能であり、LOHで作成された大きなオブジェクトは世代の回復ではありません)最初に作成されGen0、アプリケーションの存続期間中に存続するオブジェクトのみがに移動しましたGen1。ただし、がいっぱいの場合Gen0(GCはガベージコレクションを実行してクリーンアップしGen0、まだいっぱいの場合)は、すべての新しいオブジェクトがで作成されることに注意してGen1ください。
于 2012-10-30T14:37:49.183 に答える