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