ラージオブジェクトヒープとGC第3世代オブジェクトの違いは何ですか?
1 に答える
LOH(Large Object Heap)は、大きなオブジェクトが直接割り当てられ、収集されるまでそこにとどまる単一のヒープです。オブジェクトは、サイズに基づいてLOHに直接割り当てられます(例:85000バイト以上)。
世代別オブジェクトは、単一のヒープであるSOH(Small Object Heap)に割り当てられる「小さな」オブジェクトです。SOH内のオブジェクトには、最大世代(2など)まで存続したコレクションの数を示す関連世代があります。世代番号は0から始まるため、第2世代のオブジェクトは、最小で存続したため、第3世代として記述できます。 3つのコレクション、つまり世代0、1、2。
世代は、ガベージスキャンを最適化するのに役立ちます。寿命の長いオブジェクトは、コレクションを存続させるにつれて世代数が増加し、数が多い世代ほどスキャンされる頻度が低くなります。このメカニズムにより、短命ではないオブジェクトのスキャン頻度が低くなり、したがって不必要にスキャンされます。生成スキームは、多数のオブジェクトが存在するヒープの優れた最適化と見なされるため、SOHに適用されます。
アップデート
私が理解している限り、LOHオブジェクトは最大世代であると報告されていますが、これは単なるデフォルト値であると思います。それらは実際にはどの世代にもありません。つまり、第2世代のSOHオブジェクトとLOHオブジェクトは同じ「リスト」にありません。ただし、@ Henkが指摘しているように、第2世代の収集を実行すると、この時点でLOHオブジェクトも収集されます。したがって、概念的には、第2世代とLOHの間には関係があります。これは、.Net2.0の時点では正しいです。
参照:カバーされていないラージオブジェクトヒープ
世代の観点から見ると、大きなオブジェクトは、第2世代のコレクションがある場合にのみ収集されるため、第2世代に属します。
ただし、収集の関係は明らかですが、それが成り立たない例は世代の圧縮です。世代が収集されると、圧縮される場合もあります。ただし、LOHは圧縮されていないため、第2世代のオブジェクトに発生するすべてがLOH内のオブジェクトに発生するとは言えません。
[Test]
public void large_object_heap_objects_are_reported_as_max_generation()
{
int[] bling = new int[85000 / 4];
int maxGen = GC.MaxGeneration;
int objectGen = GC.GetGeneration(bling);
Assert.AreEqual(maxGen, objectGen, "Large object is at max generation.");
}