Значения в статических полях в .NET попадают в поколение 2 (Gen 2). Это связано с тем, что статические поля принадлежат типу, а не экземпляру класса, и живут на протяжении всего времени работы приложения.
Причины размещения в поколении 2:
- Долговечность объектов в статических полях
- Объекты, хранящиеся в статических полях, создаются один раз и существуют до завершения работы приложения или выгрузки домена приложения.
- Сборщик мусора редко очищает Gen 2, так как предполагается, что содержащиеся в нём объекты будут использоваться длительное время.
- Связь со статическими конструкторами
- Статические поля инициализируются либо в момент загрузки типа, либо при первом обращении к ним.
- После инициализации они продолжают существовать до завершения процесса, а их значения остаются доступными независимо от жизненного цикла экземпляров класса.
- Область памяти Large Object Heap (LOH)
- Если статическое поле содержит крупный объект (размером более 85 000 байт), он будет размещён в куче крупных объектов (LOH), которая также управляется через Gen 2.
Пример кода:
class Example
{
private static readonly string StaticString = "Hello, World!";
private static readonly int[] LargeArray = new int[100000];
}
В этом примере:
StaticString
будет находиться в Gen 2.LargeArray
попадёт в Large Object Heap, который также управляется через Gen 2.
Исключения
- Если статическое поле содержит ссылку на объект, который создаётся и пересоздаётся в рантайме, сам объект может попасть в Gen 0 или Gen 1, но ссылка на него останется в Gen 2.
- При использовании доменов приложения в .NET Framework статические поля могли очищаться при выгрузке домена.
Значения в статических полях в .NET обычно попадают в поколение 2, поскольку считаются долгоживущими. Это позволяет сборщику мусора минимизировать частоту их проверки и очистки, улучшая производительность управления памятью.