Поколение - это некое хранилище, которое содержит в себе объекты.
При сборке поколения 0, выжившие объекты переходят в поколение 1.
В поколении 2 хранятся долгоживущие объекты. Однако, если мысоздаем крупный объект, то он сразу попадает в поколение 2.
Иногда покление крупных объектов называют поколением 3, но фактически сборка происходит при сборке поколения 2.
Если размер объекта больше или равен 85 000 байтов, он считается крупным объектом.
Когда мы собираем старшее поколение, младшие поколения также собираются.
Объекты, пережившие сборку мусора последнего поколения, по-прежнему будут относиться к этому поколению.
Если объект меньше 85 000 байтов, он будет помещен в сегмент SOH (куча малых объектов). В противном случае он помещается в сегмент LOH (куча больших объектов).
SOH сжимается и дефрагментируется, чтобы данные хранились с минимальным оверхедом по памяти.
LOH по-умолчанию не сжимается, что может приводить к большому потреблению reserved памяти. То есть если большой объект будет удален между существующими объектами, то место не будет освобождено и может быть занято в дальнейшем.
Для LOH существует возможность сжатия через свойство GCSettings.LargeObjectHeapCompactionMode, таким образом при сборке LOH будет сжиматься и куча больших объектов.