答えて

17

LOH(ラージオブジェクトヒープ)は、大きなオブジェクトが直接割り当てられ、収集されるまでそこにとどまる単一のヒープです。オブジェクトは、そのサイズに基づいてLOHに直接割り当てられる。 85000バイト以上です。

世代オブジェクトは、単一のヒープであるSOH(Small Object Heap)に割り当てられる「小さな」オブジェクトです。 SOH内のオブジェクトは、最大世代まで生き残ったコレクションの数を示す関連世代を有する。世代番号が0から始まるとき、世代2のオブジェクトは、世代0,1,2のうち少なくとも3つのコレクションから生き延びたので、第3世代として記述することができる。

世代はガベージスキャンの最適化に役立ちます。長寿命のオブジェクトは、コレクションに残っているほど世代番号が増え、数の多い世代はスキャン頻度が低くなります。このメカニズムにより、短命ではないオブジェクトがスキャンされる頻度が少なくなり、不必要にスキャンされることになります。世代スキームはSOHに適用され、多くのオブジェクトが存在するヒープの最適な最適化として見られます。

更新

は、私の知る限りLOHオブジェクトを理解し、最大世代であると報告されているが、私は、これは単にデフォルト値であると信じています。それらは実際には何世代にもない、すなわち世代2のSOHオブジェクトであり、LOHオブジェクトは同じ「リスト」にはない。しかし、@Henkによって指摘されているように、世代2のコレクションを実行するとき、LOHオブジェクトもこの時点で収集されます。概念的には、世代2とLOHとの間には関係があります。これは、.NET 2.0のように正しいです:

参照:第2世代のコレクションがある場合にのみ、それらを収集しているためLarge Object Heap Uncovered

ビューの発生点からは、ラージオブジェクトは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."); 
} 
+0

85kbを超えるオブジェクトは常にLOHに移動し、SOHには移動しません。 –

+0

私はLOHオブジェクトも世代に属していると思っていますが、100%確実ではありません。しかし、彼らはマークされ、同じ掃引されている間、彼らは圧縮されていません。 –

+0

LOHには何世代もありませんか? –

関連する問題