Разница между объектами третьего поколения и кучей больших объектов - PullRequest
4 голосов
/ 02 февраля 2011

В чем разница между кучей больших объектов и объектами GC 3-го поколения?

1 Ответ

18 голосов
/ 02 февраля 2011

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

Объекты поколения - это "маленькие" объекты, которые размещаются в SOH (куче малых объектов), которая представляет собой одну кучу. Объекты в SOH имеют ассоциированное поколение, которое обозначает, сколько коллекций они пережили до максимального поколения, например 2. Поскольку номер поколения начинается с 0, объект в поколении 2 можно описать как 3-е поколение, поскольку он пережил минимум 3 коллекции, то есть поколения 0,1,2.

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

Обновление

Насколько я понимаю, объекты LOH считаются находящимися в максимальном поколении, но я считаю, что это просто значение по умолчанию. На самом деле их нет ни в одном поколении, то есть объектах SOH поколения 2 и объектах LOH нет в одном и том же «списке». Однако, как отмечает @Henk, при выполнении коллекции поколения 2 объекты LOH также собираются в это время. Так что концептуально существует связь между поколением 2 и LOH. Это правильно с .Net 2.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.");
}
...