ответ

17

LOH (Большая куча объектов) представляет собой единую кучу, где большие объекты распределяются напрямую и остаются там до тех пор, пока они не будут собраны. Объекты непосредственно распределяются в LOH на основе их размера, например. равным или превышающим 85000 байт.

Объекты генерации - это «маленькие» объекты, которые выделяются в SOH (Small Object Heap), которая представляет собой одну кучу. Объекты в SOH имеют ассоциированное поколение, которое обозначает, сколько коллекций они выжили до максимального поколения, например. 2. Когда число поколений начинается с 0, объект в поколении 2 может быть описан как 3-е поколение, так как он выжил как минимум из 3 коллекций, то есть поколений 0,1,2.

Поколения помогают оптимизировать сканирование мусора. Долгоживущие объекты увеличивают количество своих поколений, поскольку они выживают в коллекциях, а поколения с более высоким числом сканируются реже. Этот механизм приводит к тому, что объекты, которые недолговечны, сканируются реже и, следовательно, излишне. Схема генерации применяется к SOH, поскольку она рассматривается как хорошая оптимизация для кучи, где будет много объектов.

Update

Насколько я понимаю, объекты LOH представлены как в макс поколения, но я считаю, что это просто значение по умолчанию. Они не на самом деле ни в одном поколении, то есть 2 поколения SOH-объектов и объекты LOH не находятся в одном и том же «списке». Однако, как отметил @Henk, при выполнении коллекции поколения 2 в это время также собираются объекты LOH. Таким образом, концептуально существует связь между поколением 2 и LOH. Это правильно, как в .Net 2.0:

См: Large Object Heap Uncovered

С точки зрения генерации, крупные объекты принадлежат к поколению 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."); 
} 
+0

Итак, объекты, размер которых больше 85kb, всегда идут в LOH, а не в SOH, это правило? –

+0

Я думал, что объекты LOH также принадлежат поколению, а не на 100% уверены. Но пока они обозначены и подметаются одинаково, они не уплотняются. –

+0

И нет поколений в LOH? –