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