.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 также предоставляет разработчикам несколько способов повлиять на его поведение, что может быть весьма полезно для повышения производительности.