Учебники

.NET Core — Сборка мусора

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

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

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

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

  • Этот процесс известен как сборка мусора .

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

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

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

Этот процесс известен как сборка мусора .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Система имеет низкую физическую память.

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

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

Система имеет низкую физическую память.

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

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

Поколения

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

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

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

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

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

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

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

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

Во втором поколении все длинные объекты живут, и их куча может стать очень большой.

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

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

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

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

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

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

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

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

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