.NET Core - сборка мусора

В этой главе мы рассмотрим концепцию сборки мусора, которая является одной из наиболее важных функций платформы управляемого кода .NET. Сборщик мусора (GC) управляет выделением и освобождением памяти. Сборщик мусора служит автоматическим диспетчером памяти.

  • Вам не нужно знать, как выделять и освобождать память или управлять временем жизни объектов, которые используют эту память.

  • Выделение выполняется каждый раз, когда вы объявляете объект с помощью ключевого слова «новое» или когда тип значения помещается в рамку. Распределение обычно происходит очень быстро

  • Когда недостаточно памяти для выделения объекта, сборщик мусора должен собирать и удалять мусорную память, чтобы сделать память доступной для новых выделений.

  • Этот процесс известен как garbage collection.

Преимущества сборки мусора

Сборка мусора обеспечивает следующие преимущества -

  • Вам не нужно освобождать память вручную при разработке приложения.

  • Он также эффективно выделяет объекты в управляемой куче.

  • Когда объекты больше не используются, он освободит эти объекты, очистив их память, и оставит память доступной для будущих распределений.

  • Управляемые объекты автоматически получают чистый контент для начала, поэтому их конструкторам не нужно инициализировать каждое поле данных.

  • Он также обеспечивает безопасность памяти, гарантируя, что объект не может использовать содержимое другого объекта.

Условия для сборки мусора

Сборка мусора происходит, если выполняется одно из следующих условий.

  • В системе мало физической памяти.

  • Объем памяти, используемый выделенными объектами в управляемой куче, превышает допустимый порог. Этот порог постоянно корректируется по мере выполнения процесса.

  • В GC.Collectвызывается метод, и почти во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора работает постоянно. Этот метод в основном используется для уникальных ситуаций и тестирования.

Поколения

Сборщик мусора .NET имеет 3 поколения, и каждое поколение имеет свою собственную кучу, которая используется для хранения выделенных объектов. Существует основной принцип, согласно которому большинство объектов либо недолговечны, либо долгоживущи.

Первое поколение (0)

  • В поколении 0 сначала выделяются объекты.

  • В этом поколении объекты часто не живут после первого поколения, так как они больше не используются (вне области видимости) к моменту следующей сборки мусора.

  • Генерация 0 собирается быстро, поскольку связанная с ней куча мала.

Второе поколение (1)

  • В поколении 1 у объектов есть второй шанс.

  • Объекты, которые недолговечны, но выживают в коллекции поколения 0 (часто основанной на совпадении по времени), переходят в поколение 1.

  • Коллекции поколения 1 также быстрые, потому что связанная с ними куча также мала.

  • Первые две кучи остаются небольшими, потому что объекты либо собираются, либо перемещаются в кучу следующего поколения.

Поколение третье (2)

  • В поколении 2 все длинные объекты «живы», и их куча может увеличиваться до очень больших размеров.

  • Объекты в этом поколении могут существовать долгое время, и не существует кучи следующего поколения для дальнейшего продвижения объектов.

  • Сборщик мусора имеет дополнительную кучу для больших объектов, известную как куча больших объектов (LOH).

  • Он зарезервирован для объектов размером 85 000 байт и более.

  • Большие объекты не выделяются в кучах поколений, а выделяются непосредственно в LOH.

  • Коллекции поколения 2 и LOH могут занять заметное время для программ, которые выполняются в течение длительного времени или работают с большими объемами данных.

  • Известно, что большие серверные программы имеют кучи размером в 10 ГБ.

  • Сборщик мусора использует различные методы, чтобы сократить время, в течение которого он блокирует выполнение программы.

  • Основной подход состоит в том, чтобы выполнять как можно больше работы по сборке мусора в фоновом потоке таким образом, чтобы это не мешало выполнению программы.

  • GC также предоставляет разработчикам несколько способов повлиять на его поведение, что может быть весьма полезно для повышения производительности.