В какое поколение попадают значения в статических полях в C# .NET?

Значения в статических полях в .NET попадают в поколение 2 (Gen 2). Это связано с тем, что статические поля принадлежат типу, а не экземпляру класса, и живут на протяжении всего времени работы приложения.

Причины размещения в поколении 2:

  1. Долговечность объектов в статических полях
    • Объекты, хранящиеся в статических полях, создаются один раз и существуют до завершения работы приложения или выгрузки домена приложения.
    • Сборщик мусора редко очищает Gen 2, так как предполагается, что содержащиеся в нём объекты будут использоваться длительное время.
  2. Связь со статическими конструкторами
    • Статические поля инициализируются либо в момент загрузки типа, либо при первом обращении к ним.
    • После инициализации они продолжают существовать до завершения процесса, а их значения остаются доступными независимо от жизненного цикла экземпляров класса.
  3. Область памяти 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, поскольку считаются долгоживущими. Это позволяет сборщику мусора минимизировать частоту их проверки и очистки, улучшая производительность управления памятью.