回答

17

LOH(大對象堆)是一個單獨的堆,其中大對象直接分配並保留,直到它們被收集。對象根據其大小直接分配到LOH中,例如,等於或大於85000字節。

分代對象是分配到單個堆的SOH(小對象堆)中的「小」對象。 SOH中的對象具有關聯的一代,其表示在最大代數之後他們已經存活了多少集合,例如, 2.由於代號從0開始,第2代中的對象可以被描述爲第3代,因爲它已經存活了最少3個集合,即世代0,1,2。

世代有助於優化垃圾掃描。長壽命物體的世代數量在收集時保持增長,而數量較高的世代的掃描次數較少。這種機制導致不是短暫的對象被掃描的頻率較低,因此不必要地進行掃描。世代方案適用於SOH,因爲它被看作是一個很好的優化堆的地方會有很多的對象。

更新

據我瞭解LOH對象報告爲最大值產生之中,但我相信這只是一個默認值。它們實際上並不屬於任何一代,即第二代SOH對象和LOH對象不在同一個「列表」中。但是,正如@亨克指出的那樣,在進行第二代收集時,此時還收集了LOH對象。所以在概念上,第二代和LOH之間存在關係。這是因爲NET 2.0的正確:

參見:Large Object Heap Uncovered

從一個產生點,大對象屬於第2代,因爲他們只收集時,有一個2代集合。

但是,雖然收集關係是明顯的,但它不成立的例子是生成壓縮。當收集一代時,它也可能被壓縮。然而,LOH並沒有被壓縮,所以不能說第二代物體發生的一切都發生在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."); 
}